异常这部分的知识我实践的较少,所以自认为理解和掌握的都还不够好(其实每个部分实践的都比较少,掌握的也都不好),由于之前的系列文章中对于异常已经有了一些介绍,这次还是以补充为主。
raise
语句:我对其的个人理解这个方法就是在使用了try...except
代码块之后起到了一个开关的作用,我可以通过是否在except中添加这个方法来起到是否捕获异常的作用。如果我们不使用try。。。except
代码块捕获异常,就和使用了try。。。except
之后再使用raise()
起到的作用是一样的。请见书中示例:
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
我们再来看一下具体的使用过程:
>>> calculator = MuffledCalculator()
>>> calculator.calc('10 / 2') 5.0
>>> calculator.calc('10 / 0') # 关闭了抑制功能
Traceback (most recent call last): File "<stdin>", line 1, in ?
File "MuffledCalculator.py", line 6, in calc 7 return eval(expr)
File "<string>", line 0, in ?
ZeroDivisionError: integer division or modulo by zero
>>> calculator.muffled = True
>>> calculator.calc('10 / 0')
Division by zero is illegal
如上述代码的运行结果可以看出,我们在关闭了抑制功能(即使用了raise
),也就捕获了异常,并向上继续传播。
-
捕获多种异常:在之前的文章中我介绍了捕获一种异常的写法,而捕获多种异常就是同时使用多个
except
语句即可。或在一个元组中定义多个异常,使用一个except
语句将其捕获。 -
finally
: 无论try
子句中发生了什么异常,都将执行finally
子句。ps:不知道各位读者是否还记得我在之前的文章中写到我对于
if...else
代码块和try...except
代码块之间的困惑,这本书的作者也给出了他自己的看法:
有时候,可使用条件语句来达成异常处理实现的目标,但这样编写出来的代码可能不那么自 然,可读性也没那么高。另一方面,有些任务使用if/else完成时看似很自然,但实际上使用 try/except来完成要好得多。
一般而言,除非程序存在性能 方面的问题,否则不应过多考虑这样的优化。关键是在很多情况下,相比于使用if/else,使用try/except语句更自然,也更符合Python的风格。因此你应养成尽可能使用try/except语句的习惯。