2.1.3.1 捕捉异常
当with
代码块中抛出了异常,异常会作为参数传递给exit
。与sys.exc_info()类似使用三个参数:type, value, traceback。当没有异常抛出时,None
被用于三个参数。上下文管理器可以通过从exit
返回true值来“吞下”异常。可以很简单的忽略异常,因为如果exit
没有使用return
,并且直接运行到最后,返回None
,一个false值,因此,异常在exit
完成后重新抛出。
捕捉异常的能力开启了一些有趣的可能性。一个经典的例子来自于单元测试-我们想要确保一些代码抛出正确类型的异常:
In [2]:
class assert_raises(object):
# based on pytest and unittest.TestCase
def __init__(self, type):
self.type = type
def __enter__(self):
pass
def __exit__(self, type, value, traceback):
if type is None:
raise AssertionError('exception expected')
if issubclass(type, self.type):
return True # swallow the expected exception
raise AssertionError('wrong exception type')
with assert_raises(KeyError):
{}['foo']