2.1.3.1 捕捉异常

with代码块中抛出了异常,异常会作为参数传递给exit。与sys.exc_info()类似使用三个参数:type, value, traceback。当没有异常抛出时,None被用于三个参数。上下文管理器可以通过从exit返回true值来“吞下”异常。可以很简单的忽略异常,因为如果exit没有使用return,并且直接运行到最后,返回None,一个false值,因此,异常在exit完成后重新抛出。

捕捉异常的能力开启了一些有趣的可能性。一个经典的例子来自于单元测试-我们想要确保一些代码抛出正确类型的异常:

In [2]:

  1. class assert_raises(object):
  2. # based on pytest and unittest.TestCase
  3. def __init__(self, type):
  4. self.type = type
  5. def __enter__(self):
  6. pass
  7. def __exit__(self, type, value, traceback):
  8. if type is None:
  9. raise AssertionError('exception expected')
  10. if issubclass(type, self.type):
  11. return True # swallow the expected exception
  12. raise AssertionError('wrong exception type')
  13. with assert_raises(KeyError):
  14. {}['foo']