【问题标题】:Re-raise confusion再次引发混乱
【发布时间】:2016-12-06 09:35:39
【问题描述】:

如果我调用可能引发 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:

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

【问题讨论】:

  • 如果在 AttributeError 上隐式引发,您将获得更好的堆栈跟踪
  • @VasiliSyrakis 不是真的,使用raise 会完全一样
  • 2.很好

标签: python exception raise


【解决方案1】:

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

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

在您必须进行一些清理或需要在引发之前调用函数的情况下,再次引发将很有用:

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

     raise

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多