错误和异常
错误
错误(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') # # 此行代码能被顺利输出
上述代码块的执行过程:
- try 语句块中执行 r = 10 / 0 语句,由于除数为 0,会引发一个 ZeroDivisionError 异常。
- 程序跳到 except ZeroDivisionError 语句块中执行,打印一条错误信息 "除数不能为 0"。
- except 语句块执行完毕后,程序继续执行 finally 语句块中的代码,输出一条消息 "finally hello, world"。
- finally 语句块执行完毕后,程序继续执行 print('done') 语句,输出一条消息 "done"。
即使 try 语句块中出现了异常,也不会使程序终止,而是跳到相应的 except 语句块中执行,然后再执行 finally 语句块中的代码。finally 语句块中的代码不受异常处理机制的影响,无论是否发生异常都会执行。