跳至主要內容

Python

LincZero大约 3 分钟

Python

目录

异常

语法错误和异常

Python 中(至少)有两种错误

  • 语法错误syntax errors
    • 也被称为解析错误,语法分析器指出错误行,并且在检测到错误的位置前面显示一个小“箭头”
  • 异常exceptions
    • 运行期检测到的错误称为异常,最终会产生一个错误信息,错误信息的最后一行指出发生了什么错误

异常类型

异常有不同的类型,异常类型做为错误信息的一部分显示出来

常见的有

异常处理(try-except-else & raise)

try-except-else 使用

  • 使用

    • try-except-else & raise
  • 处理流程

    • 首先,执行 try 子句 (在 tryopen in new windowexceptopen in new window 关键字之间的部分)。

    • 如果没有异常发生, except 子句 在 tryopen in new window 语句执行完毕后就被忽略了。

    • 如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。

      如果异常匹配于 exceptopen in new window 关键字后面指定的异常类型,就执行对应的except子句。然后继续执行 tryopen in new window 语句之后的代码。

    • 如果发生了一个异常,在 exceptopen in new window 子句中没有与之匹配的分支,它就会传递到上一级 tryopen in new window 语句中。

      如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息

  • 使用补充

    • 一个 tryopen in new window 语句可能包含多个 except 子句,分别指定处理不同的异常。至多只会有一个分支被执行
    • 最后一个 except 子句可以省略异常名称,以作为通配符使用

else子句 使用

finally子句 使用

  • 作用

    • 语句还有另一个可选的子句finally,目的在于定义在任何情况下都一定要执行的功能

      (不管有没有发生异常、不管异常有没有被捕捉到、不管以break/continue/return等任何方式退出)

  • 处理流程:

    • 若发生了未被except捕获的异常,则先执行finally子句,然后再重新抛出
  • 使用场景

    • 定义清理行为。比如用于释放外部资源,无论它们在使用过程中是否出错
  • 使用实例

    • with open("...") as f:的本质就是try-finally,即该语句能确保发生异常时也能顺利关闭文件f

raise 使用

用户自定义异常

异常类通常应该直接或间接的从 Exceptionopen in new window 类派生

例如:

>>> class MyError(Exception):
...     def __init__(self, value):
...         self.value = value
...     def __str__(self):
...         return repr(self.value)
...
>>> try:
...     raise MyError(2*2)
... except MyError as e:
...     print('My exception occurred, value:', e.value)
...
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'