重新引起混乱

Re-raise confusion

如果我调用一个可能引发 ValueError 或 AttributeError 的函数(例如 foo()),最好的方法是什么?如果出现 ValueError,我想提供另一种方法(例如调用 bar()),但万一的 AttributeError 我想重新引发异常?

  1. 显式重新引发特定(此处为 AttributeError)异常?

     try:
         foo() # may raise ValueError or AttributeError
     except ValueError:
         bar()
     except AttributeError:
         raise
    
  2. 还是什么都不做(隐含地重新定义)?

     try:
         foo() # may raise ValueError or AttributeError
     except ValueError:
         bar()
    

更新 1:

在编写库(至少我知道它会被不同用户使用的模块)的情况下,更好的方法是什么?显式重新引发并记录重新引发的函数或仅记录函数(写它可能隐式引发特定异常)?

您可以只排除异常而不重新引发。在您的情况下,这不是必需的:

 try:
     foo() # may raise ValueError or AttributeError
 except ValueError:
     bar()

在你必须做一些清理或需要在提升之前调用函数的情况下,再次提升会很有用,比如:

 try:
     foo() # may raise ValueError or AttributeError
 except ValueError:
     bar()

     raise