Python教程:一文了解Python的异常处理知识

简介: 在编程中,异常(exception)是指在程序执行过程中出现的错误或意外情况。当发生异常时,程序会中断执行,并将控制权转移到异常处理代码,以便对异常进行捕获和处理。

1.异常处理的基础知识

1.1 什么是异常?

在编程中,异常(exception)是指在程序执行过程中出现的错误或意外情况。当发生异常时,程序会中断执行,并将控制权转移到异常处理代码,以便对异常进行捕获和处理。

异常可以分为两类:内建异常(built-in exceptions)和自定义异常(custom exceptions)。内建异常是 Python 提供的一组预定义异常类型,而自定义异常是根据特定需求创建的用户自定义的异常类型。

1.2 异常处理的目的和好处

异常处理的目的是在程序出错时提供适当的应对措施,以确保程序的稳定性和可靠性。通过合理处理异常,我们可以:

  • 防止程序崩溃,提高程序的容错能力。
  • 提供友好的错误信息,方便调试和排查问题。
  • 实现错误恢复和资源释放,避免资源泄漏。

1.3 异常处理的基本语法(try-except 块)

在 Python 中,使用 try-except 块来处理异常。try 块用于包含可能引发异常的代码,而 except 块用于捕获和处理异常。

下面是 try-except 块的基本语法:

try:
    # 可能引发异常的代码
except ExceptionType:
    # 处理特定类型的异常
except AnotherExceptionType:
    # 处理其他类型的异常
...
else:
    # 如果没有发生任何异常,执行该代码块
finally:
    # 无论是否发生异常,最终都会执行该代码块

image.gif

try 块中,我们放置可能引发异常的代码。如果发生了异常,并且异常类型匹配了某个 except 子句中指定的异常类型,那么相应的处理代码将被执行。可以有多个 except 子句来处理不同类型的异常。

else 块是可选的,用于在没有发生任何异常时执行特定的代码块。finally 块也是可选的,无论是否发生异常,都会执行其中的代码块。

2.处理常见异常类型

Python 提供了一组内建的异常类型,如 NameErrorTypeErrorValueError 等。当程序出现对应类型的异常时,我们可以捕获并处理这些异常。

2.1 NameError 异常

NameError 异常表示使用了一个未定义的变量或函数名。下面是一个示例:

try:
    print(x)  # x 未定义
except NameError:
    print("变量 x 未定义")

image.gif

2.2 TypeError 异常

TypeError 异常表示使用了错误类型的对象或进行了不兼容的操作。下面是一个示例:

try:
    x = '5'
    y = 2
    z = x + y  # 字符串与整数相加
except TypeError:
    print("类型错误:无法将字符串和整数相加")

image.gif

2.3 ValueError 异常

ValueError 异常表示使用了具有正确类型但具有无效值的对象。下面是一个示例:

try:
    x = int('abc')  # 无法将字符串 'abc' 转换为整数
except ValueError:
    print("值错误:无法将字符串转换为整数")

image.gif

处理其他内建异常的方式与上述示例类似。

2.4 Python 中常见的内建异常类型列表:

  1. Exception:所有异常的基类
  2. StopIteration:迭代器没有更多的值
  3. StopAsyncIteration:异步迭代器没有更多的值
  4. ArithmeticError:所有数值计算错误的基类
  5. FloatingPointError:浮点计算错误
  6. OverflowError:数值运算超出最大限制
  7. ZeroDivisionError:除数为零
  8. AssertionErrorassert 语句失败
  9. AttributeError:对象没有这样的属性
  10. EOFError:没有内建输入,到达文件末尾
  11. ImportError:导入模块失败
  12. ModuleNotFoundError:找不到模块
  13. LookupError:无效数据查找的基类
  • IndexError:索引超出序列范围
  • KeyError:字典中的键不存在
  1. NameError:未声明/初始化的变量名
  2. UnboundLocalError:访问未初始化的本地变量
  3. OSError:操作系统产生的错误
  4. FileNotFoundError:文件不存在
  5. PermissionError:没有足够的权限
  6. TypeError:不同类型间的无效操作
  7. ValueError:传递给函数的参数类型正确但值不合适
  8. RuntimeError:检测到运行时错误
  9. NotImplementedError:抽象方法在子类中没有实现
  10. RecursionError:递归调用层次太深

3.处理多个异常

try-except 块中,可以使用多个 except 子句来处理不同类型的异常。下面是一个示例:

try:
    # 可能引发异常的代码
except ExceptionType1:
    # 处理 ExceptionType1 异常
except ExceptionType2:
    # 处理 ExceptionType2 异常

image.gif

在处理多个异常时,需要注意以下几点:

  • 异常类型应按照从具体到一般的顺序排列,以免某个异常被通用异常类型的 except 子句捕获而无法执行特定的处理代码。
  • 可以在一个 except 子句中捕获多个异常类型,例如 except (ExceptionType1, ExceptionType2):
  • 也可以使用多个 except 子句来处理相同的异常类型,以便在不同的子句中实现不同的处理逻辑。

下面是处理多个异常的示例:

try:
    x = 5 / 0
    print(x)
except ZeroDivisionError:
    print("除数不能为零")
except TypeError:
    print("类型错误")

image.gif

4.使用 elsefinally

除了 tryexcept 块之外,还可以使用 elsefinally 块来进一步处理异常。

4.1 else

else 块用于在没有发生任何异常时执行一些特定的代码。例如,在读取文件时,如果没有发生异常,则可以在 else 块中处理文件数据。

下面是一个示例:

try:
    file = open("data.txt", "r")
except FileNotFoundError:
    print("文件未找到")
else:
    data = file.read()
    print(data)
    file.close()

image.gif

在上述示例中,如果成功打开文件并读取数据,那么 else 块将被执行。

4.2 finally

finally 块用于定义无论是否发生异常都必须执行的代码块。一般情况下,我们可以在 finally 块中进行资源的释放和清理操作,如关闭文件、释放数据库连接等。

下面是一个示例:

try:
    file = open("data.txt", "r")
except FileNotFoundError:
    print("文件未找到")
finally:
    file.close()  # 无论是否发生异常,都会执行该代码块来关闭文件

image.gif

在上述示例中,无论是否发生异常,file.close() 都会被执行来关闭文件。

5.自定义异常

除了内建的异常类型之外,我们还可以自定义异常类来满足特定的需求。自定义异常类需要继承自 Exception 类或其子类,并可以添加额外的属性和方法。

下面是一个自定义异常类的示例:

class CustomError(Exception):
    def __init__(self, message):
        self.message = message
try:
    raise CustomError("自定义异常信息")
except CustomError as e:
    print(e.message)

image.gif

在上述示例中,我们定义了一个名为 CustomError 的自定义异常类,它继承自 Exception 类。然后,我们通过 raise 关键字抛出了一个自定义异常对象,并在 except 块中捕获并打印了异常信息。

6.异常处理的最佳实践

在处理异常时,有一些最佳实践可以帮助我们编写更清晰、可靠的代码。

6.1 适度使用异常

异常处理是用来处理异常情况的,而不应该用来控制程序流程。因此,我们应该避免过度使用异常,将其限制在真正的异常情况下。

6.2 具体异常优于通用异常

尽可能使用具体的异常类型来捕获和处理异常,而不是使用通用的异常类型。这样可以更精确地定位问题,并提供更有针对性的处理逻辑。

6.3 不要忽略异常

避免使用空的 except 子句来完全忽略异常。这样可能会导致问题被掩盖,难以调试和定位。

6.4 清理资源和关闭文件

finally 块中进行资源的释放和清理操作,以确保无论是否发生异常,都能正确地释放资源,避免资源泄漏。

7.高级异常处理技术

除了基本的 try-except 块之外,Python 还提供了一些高级异常处理技术。

7.1 使用 with 语句

with 语句是一种上下文管理器,它可以自动管理资源的分配和释放。通过使用 with 语句,我们可以简化资源管理的代码,并确保在退出代码块时正确地释放资源。

下面是一个读取文件的示例:

with open("data.txt", "r") as file:
    data = file.read()
    print(data)

image.gif

在上述示例中,open() 函数返回一个文件对象,然后将其赋值给变量 file。在 with 代码块中,我们可以自由地使用 file 对象,而不必担心在退出代码块时忘记关闭文件。当代码块执行完毕时,with 语句会自动关闭文件。

7.2 控制特定代码块中的异常

有时候,我们只想在特定的代码块中捕获和处理异常,而不影响其他代码块。Python 提供了 try-except 块的嵌套使用来实现这一目标。

下面是一个示例:

try:
    # 其他代码
    try:
        # 特定代码块
    except SpecificException:
        # 处理 SpecialException 异常
    # 其他代码
except GeneralException:
    # 处理 GeneralException 异常

image.gif

在上述示例中,外层的 try-except 块用于处理通用的异常类型,而内层的 try-except 块用于处理特定的异常类型。这样可以实现对特定代码块中的异常进行控制。

7.3 调试和记录异常

在开发过程中,调试和记录异常是非常重要的。它们可以帮助我们分析和解决异常,并提供有关

异常发生的有用信息。

7.4 调试异常信息

在开发过程中,我们可以通过输出异常信息来调试程序。Python 的内建模块 traceback 提供了异常堆栈跟踪信息,可以帮助我们定位异常发生的位置。

下面是一个示例:

import traceback
try:
    x = 5 / 0
except ZeroDivisionError as e:
    traceback.print_exc()

image.gif

在上述示例中,我们导入了 traceback 模块,并在捕获 ZeroDivisionError 异常时使用 traceback.print_exc() 打印异常堆栈跟踪信息。这样可以帮助我们更准确地了解异常的起因和位置。

7.5 记录异常信息

除了直接在控制台输出异常信息外,我们还可以将异常信息写入日志文件或数据库,以便后续分析和排查问题。

下面是一个示例:

import logging
try:
    x = 5 / 0
except ZeroDivisionError as e:
    logging.basicConfig(filename='error.log', level=logging.ERROR)
    logging.error(f'An error occurred: {e}')

image.gif

在上述示例中,我们使用 Python 的 logging 模块将异常信息记录到名为 error.log 的日志文件中。通过记录异常信息,我们可以在生产环境中更好地跟踪和解决问题。

8.异常处理常见面试题

面试题:介绍一下 Python 中 try-except-else-finally 的使用方法,并举例说明。

答案:

  • try-except 用来捕获可能发生异常的代码块。
  • elsetry 块没有引发异常时执行。
  • finally 始终执行,无论是否发生异常。

代码示例:

def divide_numbers(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Error: Division by zero!")
    else:
        print(f"Division result: {result}")
    finally:
        print("Execution complete.")
divide_numbers(10, 2)
divide_numbers(10, 0)

image.gif

输出结果:

Division result: 5.0

Execution complete.

Error: Division by zero!

Execution complete.

在上面的示例中,我们定义了一个函数 divide_numbers,尝试对两个数进行除法运算。第一次调用传入参数为 (10, 2) 没有引发异常,所以会执行 else 块和 finally 块;第二次调用传入参数为 (10, 0) 引发了 ZeroDivisionError,会执行 except 块和 finally 块。

目录
相关文章
|
1月前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
1天前
|
数据采集 监控 Python
Python爬虫异常处理:自动跳过无效URL
Python爬虫异常处理:自动跳过无效URL
Python爬虫异常处理:自动跳过无效URL
|
15天前
|
机器学习/深度学习 数据采集 数据可视化
Python/Anaconda双方案加持!Jupyter Notebook全平台下载教程来袭
Jupyter Notebook 是一款交互式编程与数据科学分析工具,支持40多种编程语言,广泛应用于机器学习、数据清洗和学术研究。其核心优势包括实时执行代码片段、支持Markdown文档与LaTeX公式混排,并可导出HTML/PDF/幻灯片等格式。本文详细介绍了Jupyter Notebook的软件定位、特性、安装方案(Anaconda集成环境与原生Python+PIP安装)、首次运行配置及常见问题解决方案,帮助用户快速上手并高效使用该工具。
|
20天前
|
SQL 关系型数据库 MySQL
milvus-use教程 python
本项目参考vanna项目,获取数据库元数据和问题SQL对,存入Milvus向量数据库,并进行相似性检索。采用m3e-large嵌入模型,通过DatabaseManager类实现数据库连接持久化,MilvusVectorStore类封装了Milvus操作方法,如创建集合、添加数据和查询。项目提供init_collections、delete_collections等文件用于初始化、删除和管理集合。所用Milvus版本较新,API与vanna项目不兼容。 [项目地址](https://gitee.com/alpbeta/milvus-use)
108 9
|
27天前
|
大数据 开发者 C++
Python语法糖详解教程
《Python语法糖详解教程》介绍了编程语言中的“语法糖”,即通过特殊语法形式简化代码,使代码更简洁、易读和高效。文章详细解析了列表推导式、字典推导式、元组解包、条件表达式、with语句和装饰器等核心语法糖,并提供了具体示例和最佳实践指南。通过这些技巧,开发者可以在保持底层功能不变的前提下,显著提升开发效率和代码质量。
46 8
|
2月前
|
IDE 测试技术 项目管理
【新手必看】PyCharm2025 免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!
PyCharm是由JetBrains开发的Python集成开发环境(IDE),专为Python开发者设计,支持Web开发、调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试和版本控制等功能。它有专业版、教育版和社区版三个版本,其中社区版免费且适合个人和小型团队使用,包含基本的Python开发功能。安装PyCharm前需先安装Python解释器,并配置环境变量。通过简单的步骤即可在PyCharm中创建并运行Python项目,如输出“Hello World”。
578 13
【新手必看】PyCharm2025 免费下载安装配置教程+Python环境搭建、图文并茂全副武装学起来才嗖嗖的快,绝对最详细!
|
1月前
|
C语言 Python
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
|
1月前
|
人工智能 数据库 开发者
[oeasy]python068_异常处理之后做些什么_try语句的完全体_最终_finally
介绍了 Python 中 `try` 语句的完全体,包括 `try`、`except`、`else` 和 `finally` 子句的使用。通过实例展示了如何捕获异常并输出详细的错误信息,如文件名和行号。特别强调了 `finally` 子句的作用,无论是否发生异常,`finally` 都会执行,常用于清理操作。最后总结了 `try` 语句的四个部分及其应用场景,并简要提及了 Python 社区的决策机制。 #try #except #else #finally
27 1
|
1月前
|
数据库连接 开发者 Python
Python中的异常处理
本文深入探讨了Python中的异常处理机制,包括异常的捕获、处理、抛出及最佳实践。通过try-except语句块,程序可以在运行时处理错误,增强健壮性和可维护性。文章还介绍了自定义异常类的创建与使用,并提供了代码示例和详细的语法说明。最后,总结了异常处理的最佳实践,如精确捕获异常、提供有用错误信息等,帮助开发者编写更可靠的代码。
89 14
|
3月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
113 8