14-异常处理
3.8 异常处理
到目前为止,在Python程序中遇到错误或“异常”,就意味着整个程序崩溃。你不希望这发生在真实世界的程序中。相反,你希望程序能检测错误,处理它们,然后继续运行。
例如,运行下面的程序,它有一个“除数为零”的错误。打开一个新的文件编辑器窗口,输入以下代码,并保存为zeroDivide.py:
def spam(divideBy):
return 42 / divideBy
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
我们已经定义了名为 spam
的函数,给了它一个变元,然后输出当输入为不同参数时该函数的值,看看会发生什么情况。下面是运行前面代码的输出结果:
21.0
3.5
Traceback (most recent call last):
File "C:/zeroDivide.py", line 6, in <module>
print(spam(0))
File "C:/zeroDivide.py", line 2, in spam
return 42 / divideBy
ZeroDivisionError: division by zero
可以在https://autbor.com/zerodivide/上查看该程序的执行情况。当试图用一个数除以零时,就会发生 ZeroDivisionError
错误。根据错误信息中给出的行号,我们知道 spam()
函数中的 return
语句导致了一个错误。
错误可以由 try
和 except
语句来处理。那些可能出错的语句被放在 try
子句中。如果错误发生,程序执行就转到接下来的 except
子句开始处。
可以将前面除数为零的代码放在一个 try
子句中,让 except
子句包含完成该错误发生时应该做的事的代码:
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
如果在 try
子句中的代码导致一个错误,程序执行就立即转到 except
子句的代码。在运行那些代码之后,执行照常继续。前面程序的输出结果如下:
21.0
3.5
Error: Invalid argument.
None
42.0
可以在https://autbor.com/tryexceptzerodivide/上查看这个程序的执行情况。请注意,在函数调用的 try
语句块中,发生的所有错误都会被捕捉。请阅读以下程序,它的做法不一样,将 spam()
调用放在语句块中:
def spam(divideBy):
return 42 / divideBy
try:
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
except ZeroDivisionError:
print('Error: Invalid argument.')
该程序运行时,输出结果如下:
21.0
3.5
Error: Invalid argument.
可以在https://autbor.com/spamintry/上查看该程序的执行情况。 print(spam(1))
从未被执行,是因为一旦执行跳到 except
子句的代码,就不会回到 try
子句。它会继续向下执行。