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

02-抛出异常

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

11.1 抛出异常

当Python试图执行无效代码时,就会抛出异常。在第 3 章中,你已学会如何使用 tryexcept 语句来处理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.

如果没有 tryexcept 语句来覆盖抛出异常的 raise 语句,那么该程序就会崩溃,并显示异常的错误信息。

通常是调用该函数的代码知道如何处理异常,而不是该函数本身。所以你常常会看到 raise 语句在一个函数中, tryexcept 语句在调用该函数的代码中。例如,打开一个新的文件编辑器窗口,输入以下代码,并将其保存为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.

使用 tryexcept 语句,你可以更优雅地处理错误,而不是让整个程序崩溃。