Python基础教程 不用提供参数

8.3.1 不用提供参数

捕获异常后,如果要重新引发它(即继续向上传播),可调用raise且不提供任何参数(也可显式地提供捕获到的异常,参见8.3.4节)。

为说明这很有用,来看一个能够“抑制”异常ZeroDivisionError的计算器类。如果启用了这种功能,计算器将打印一条错误消息,而不让异常继续传播。在与用户交互的会话中使用这个计算器时,抑制异常很有用;但在程序内部使用时,引发异常是更佳的选择(此时应关闭“抑制”功能)。下面是这样一个类的代码:

class MuffledCalculator:

muffled = False

def calc(self, expr):

try:

return eval(expr)

except ZeroDivisionError:

if self.muffled:

print('Division by zero is illegal')

else:

raise

注意 发生除零行为时,如果启用了“抑制”功能,方法calc将(隐式地)返回None。换而言之,如果启用了“抑制”功能,就不应依赖返回值。

下面的示例演示了这个类的用法(包括启用和关闭了抑制功能的情形):

>>> calculator = MuffledCalculator()

>>> calculator.calc('10 / 2')

5.0

>>> calculator.calc('10 / 0') # 关闭了抑制功能

Traceback (most recent call last): File "", line 1, in ?

File "MuffledCalculator.py", line 6, in calc

return eval(expr)

File "", line 0, in ?

ZeroDivisionError: integer division or modulo by zero

>>> calculator.muffled = True

>>> calculator.calc('10 / 0')

Division by zero is illegal

如你所见,关闭抑制功能时,捕获了异常ZeroDivisionError,但继续向上传播它。

如果无法处理异常,在except子句中使用不带参数的raise通常是不错的选择,但有时你可能想引发别的异常。在这种情况下,导致进入except子句的异常将被作为异常上下文存储起来,并出现在最终的错误消息中,如下所示:

>>> try:

... 1/0

... except ZeroDivisionError:

... raise ValueError

...

Traceback (most recent call last):

File "", line 2, in

ZeroDivisionError: division by zero

在处理上述异常时,引发了另一个异常:

Traceback (most recent call last):

File "", line 4, in

ValueError

你可使用raise ... from ...语句来提供自己的异常上下文,也可使用None来禁用上下文。

... 1/0

... except ZeroDivisionError:

... raise ValueError from None

...

Traceback (most recent call last):

File "", line 4, in

ValueError

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181112G0DNR300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券