当前位置:嗨网首页>书籍在线阅读

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 语句导致了一个错误。

错误可以由 tryexcept 语句来处理。那些可能出错的语句被放在 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 子句。它会继续向下执行。