返回介绍

3.7 异常处理

发布于 2024-01-22 21:44:07 字数 1841 浏览 0 评论 0 收藏 0

到目前为止,在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

当试图用一个数除以零时,就会发生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

请注意,在函数调用中的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.

print(spam(1))从未被执行是因为,一旦执行跳到except子句的代码,就不会回到try子句。它会继续照常向下执行。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文