重新引起混乱
Re-raise confusion
如果我调用一个可能引发 ValueError 或 AttributeError 的函数(例如 foo()),最好的方法是什么?如果出现 ValueError,我想提供另一种方法(例如调用 bar()),但万一的 AttributeError 我想重新引发异常?
显式重新引发特定(此处为 AttributeError)异常?
try:
foo() # may raise ValueError or AttributeError
except ValueError:
bar()
except AttributeError:
raise
还是什么都不做(隐含地重新定义)?
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
如果我调用一个可能引发 ValueError 或 AttributeError 的函数(例如 foo()),最好的方法是什么?如果出现 ValueError,我想提供另一种方法(例如调用 bar()),但万一的 AttributeError 我想重新引发异常?
显式重新引发特定(此处为 AttributeError)异常?
try: foo() # may raise ValueError or AttributeError except ValueError: bar() except AttributeError: raise
还是什么都不做(隐含地重新定义)?
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