错误和异常

错误

错误(Error)是指程序执行过程中发生的问题,例如语法错误(Syntax Error)、类型错误(Type Error)等。错误是由 Python 解释器检测到的,会使程序终止并显示错误信息。

print('Hello world
#   File "<stdin>", line 1
#     print('Hello world
#           ^
# SyntaxError: unterminated string literal (detected at line 1)

运行上述代码,Python 会报错,这是个典型的语法错误,这种错误发生在 Python 解释器的语法分析阶段,程序还没开始运行。

异常

即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。异常(Exception)是指在程序执行过程中遇到的问题,例如除零错误(ZeroDivisionError)、索引错误(IndexError)等。异常是由程序运行时检测到的,会引发一个异常对象,并且可以通过异常处理机制来捕获和处理。大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:

r = 10 / 0
print('result:', r)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ZeroDivisionError: division by zero

异常处理

异常捕获

对于异常来说,是可以被程序捕捉到的,在 Python 中使用 try/except 语句来捕获异常,防止它变成错误终止程序。异常处理的语法如下:

try:
    # 可能引发异常的代码
except 异常类型1:
    # 处理异常类型1的代码
except 异常类型2 as e:
    # 处理异常类型2的代码
    # 我们可以使用 as 关键字来创建一个变量,将异常对象赋值给它
    # 这个变量可以在except块中使用,以便我们能够查看和处理异常的信息
    print(e)
except:
    # 处理其他类型的异常的代码
finally:
    # 无论是否发生异常,都会执行的代码

还是以上述代码为例:

try:
  r = 10 / 0
  print('result:', r) # 这行不会被输出
except ZeroDivisionError as e:
  print('除数不能为 0', e)
finally:
  print('finally hello, world') # 此行代码能被顺利输出

print('done') # # 此行代码能被顺利输出

上述代码块的执行过程:

  1. try 语句块中执行 r = 10 / 0 语句,由于除数为 0,会引发一个 ZeroDivisionError 异常。
  2. 程序跳到 except ZeroDivisionError 语句块中执行,打印一条错误信息 "除数不能为 0"。
  3. except 语句块执行完毕后,程序继续执行 finally 语句块中的代码,输出一条消息 "finally hello, world"。
  4. finally 语句块执行完毕后,程序继续执行 print('done') 语句,输出一条消息 "done"。

即使 try 语句块中出现了异常,也不会使程序终止,而是跳到相应的 except 语句块中执行,然后再执行 finally 语句块中的代码。finally 语句块中的代码不受异常处理机制的影响,无论是否发生异常都会执行。