python中的异常处理
异常处理
异常处理是 Python 中处理程序运行时错误的重要机制。它允许程序在遇到错误时优雅地处理,而不是直接崩溃。合理使用可以使代码更加可靠和易于维护。
使用异常处理的时候要注意的事件:
- 尽量捕获特定的异常,而不是通用的
Exception
- 在异常处理中包含尽可能多的错误信息
- 使用
finally
块来释放资源(如文件、网络连接等) - 避免空的
except
块(这会隐藏所有错误) - 合理使用自定义异常来提高代码可读性
基础写法如下:
try:# 可能引发异常的代码result = 10 / 0
except ZeroDivisionError: # 除零异常# 处理特定异常print("不能除以零!")
except (TypeError, ValueError) as e: # 类型异常和传值异常,将这些异常统一写作别名e# 处理多种异常print(f"类型或值错误: {e}")
except Exception as e:# 处理所有除以上异常之外的其他异常print(f"发生未知错误: {e}")
else:# 如果没有异常发生,执行这部分代码print("一切正常!")
finally:# 无论是否发生异常,都会执行这部分代码print("清理工作完成")
常见异常类型
Exception
: 所有异常的基类ValueError
:传值异常,即当传入无效的参数时发生的错误TypeError
: 类型异常,当操作或函数应用于不适当类型的对象时的异常IndexError
: 索引超出范围(索引不存在)的异常KeyError
:字典键不存在的异常FileNotFoundError
:当文件或目录不存在时的异常ZeroDivisionError
:除零异常,当除数为零时的异常AttributeError
: 方法不存在异常,当属性引用或赋值失败时的异常IndentationError
:缩进异常SyntaxError
:python的语法错误NameError
:未被声明的变量的异常
抛出异常(raise
语句)
- raise 关键字用于主动抛出异常(也称为抛出异常),可以使用它来触发内置的异常,或者自定义的异常。
- 直接使用 raise 抛出新异常,Python 会自动设置异常发生的上下文。(隐式链式异常)
- 使用raise … from … 用于显式地关联两个异常,形成一个异常链(可在调试的时候使用),使用 from 显式指定异常的原因。
- raise from None (禁止异常链):如果想隐藏原始异常,可以使用 raise … from None
# 隐式链式异常
try:1 / 0
except ZeroDivisionError:raise ValueError("除数不能为零")
# 显式链式异常
try:1 / 0
except ZeroDivisionError as e:raise ValueError("除数不能为零") from e
# 禁止显示异常链,但现实自己写的异常信息
try:1 / 0
except ZeroDivisionError:raise ValueError("除数不能为零") from None
自定义异常(继承 Exception
类来创建自定义异常)
class MyCustomError(Exception):#自定义异常类def __init__(self, message, code):super().__init__(message)self.code = code
try:raise MyCustomError("发生了自定义错误", 500)
except MyCustomError as e:print(f"错误消息: {e}, 错误代码: {e.code}")