14.10 重新抛出被捕获的异常

问题

你在一个 except 块中捕获了一个异常,现在想重新抛出它。

解决方案

简单的使用一个单独的 rasie 语句即可,例如:

  1. >>> def example():
  2. ... try:
  3. ... int('N/A')
  4. ... except ValueError:
  5. ... print("Didn't work")
  6. ... raise
  7. ...
  8.  
  9. >>> example()
  10. Didn't work
  11. Traceback (most recent call last):
  12. File "<stdin>", line 1, in <module>
  13. File "<stdin>", line 3, in example
  14. ValueError: invalid literal for int() with base 10: 'N/A'
  15. >>>

讨论

这个问题通常是当你需要在捕获异常后执行某个操作(比如记录日志、清理等),但是之后想将异常传播下去。一个很常见的用法是在捕获所有异常的处理器中:

  1. try:
  2. ...
  3. except Exception as e:
  4. # Process exception information in some way
  5. ...
  6.  
  7. # Propagate the exception
  8. raise

原文:

http://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p10_reraising_the_last_exception.html