异常

写代码时解释器会提示我们语法错误,但是即便在语法正确时,我们往往也会遇到很多错误。我们把执行时检测到的错误称为异常。

python 中所有的异常都派生于 BaseException,然后有个类 Exception 继承该类,Exception 下有很多经常被引发的异常,比如 ImportError, IndexError 等,我们自定义的异常也要继承于 Exception [^1]

异常处理

python 的异常处理语句为:

try:
    pass
except Error1:
    # Error1 发生时
except Error2 as e:
    # Error2 发生时
else:
    # (option) try 子句没有引发异常时执行
finally:
    pass

工作的逻辑是这样的 [^2]:

  • 执行 try 语句
  • 如果发生异常则进入该异常对应的 except

但是需要注意:

  • 如果有多个 except,只会执行第一个,比如如果同时发生了 Error1Error2,就不会再进入。
  • except 后可以用 as 将变量绑定到异常的实例上。
  • 如果 except 后没有指定异常类型,则捕捉所有的异常
  • 如果发生的异常与 except 的异常不匹配,则它会被传递到外部的 try 语句中
  • 如果没有找到异常处理程序,则它是一个未处理异常,且执行将终止并输出如上所示的消息。

自定义异常

自定义异常需要继承 Exception 类,抛出异常我们可以使用 raise

class MyError(Exception):
    def __init__(self, message):
        super().__init__()
        self.message = message

    def __str__(self) -> str:
        return self.message


try:
    raise MyError("test")
except MyError as e:
    print(e, "success")
# output: test success

异常信息

我们想做到 python 自带的异常那样的提示信息,可以用到一个模块 traceback,以后用到的时候再看看文档吧

相关阅读

  1. Python异常处理 「详细讲解」- 异常的概念、异常捕获、异常的传递、主动抛出异常 - 知乎

References

[^1]:内置异常 - Python 3.12.0 文档
[^2]:错误和异常 - Python 3.12.0 文档