02-抛出异常
11.1 抛出异常
当Python试图执行无效代码时,就会抛出异常。在第 3 章中,你已学会如何使用 try
和 except
语句来处理Python的异常,这样程序就可以从你预期的异常中恢复。你也可以在代码中抛出自己的异常。抛出异常相当于对程序说:“停止运行这个函数中的代码,将程序执行转到 except
语句。”
抛出异常使用 raise
语句。在代码中, raise
语句包含以下部分。
raise
关键字。- 对
Exception()
函数的调用。 - 传递给
Exception()
函数的字符串,包含有用的错误信息。
例如,在交互式环境中输入以下代码:
>>> raise Exception('This is the error message.')
Traceback (most recent call last):
File "<pyshell#191>", line 1, in <module>
raise Exception('This is the error message.')
Exception: This is the error message.
如果没有 try
和 except
语句来覆盖抛出异常的 raise
语句,那么该程序就会崩溃,并显示异常的错误信息。
通常是调用该函数的代码知道如何处理异常,而不是该函数本身。所以你常常会看到 raise
语句在一个函数中, try
和 except
语句在调用该函数的代码中。例如,打开一个新的文件编辑器窗口,输入以下代码,并将其保存为boxPrint.py:
def boxPrint(symbol, width, height):
if len(symbol) != 1:
❶ raise Exception('Symbol must be a single character string.')
if width <= 2:
❷ raise Exception('Width must be greater than 2.')
if height <= 2:
❸ raise Exception('Height must be greater than 2.')
print(symbol * width)
for i in range(height - 2):
print(symbol + (' ' * (width - 2)) + symbol)
print(symbol * width)
for sym, w, h in (('*', 4, 4), ('O', 20, 5), ('x', 1, 3), ('ZZ', 3, 3)):
try:
boxPrint(sym, w, h)
❹ except Exception as err:
❺ print('An exception happened: ' + str(err))
可以在https://autbor.com/boxprint上查看该程序的执行情况。这里我们定义了一个 boxPrint()
函数,它接收一个字符、一个宽度值和一个高度值。它按照指定的宽度和高度,用该字符创建了一个小盒子的图像。这个盒子被输出到屏幕上。
假定我们希望该字符是一个字符,且宽度和高度要大于2。我们添加了 if
语句,如果这些条件没有满足,就抛出异常。稍后,当我们用不同的参数调用 boxPrint()
时, try…except
语句就会处理无效的参数。
这个程序使用了 except
语句的 except Exception as err
形式❹。如果 boxPrint()
返回一个 Exception
对象❶❷❸,那么这条 except
语句就会将该对象保存在名为 err
的变量中。 Exception
对象可以传递给 str()
以将它转换为一个字符串,从而得到对用户友好的错误信息❺。运行boxPrint.py,输出结果看起来像这样:
****
* *
* *
****
OOOOOOOOOOOOOOOOOOOO
O O
O O
O O
OOOOOOOOOOOOOOOOOOOO
An exception happened: Width must be greater than 2.
An exception happened: Symbol must be a single character string.
使用 try
和 except
语句,你可以更优雅地处理错误,而不是让整个程序崩溃。