【发布时间】:2014-09-20 00:54:20
【问题描述】:
我正在学习使用 python。我刚看到这篇文章: http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html 它描述了在 python 中重新抛出异常,如下所示:
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
既然你重新抛出异常,就应该有一个“外部catch-except”语句。但是现在,我在想,如果 except 中的 do_something_to_apologize() 抛出错误怎么办。哪一个将被捕获在外部“catch-except”中?你重新扔的那个还是do_something_to_apologize() 扔的那个?
还是先捕获优先级最高的异常?
【问题讨论】:
-
先发生的那个。
-
你抓到的那个?
-
这正是为什么 (a) 你想要编写不能引发的异常处理程序,或者只能在你非常了解的特定情况下引发,以及 (b) 你想要实际得到异常对象,至少在早期调试期间,所以你可以,例如,
print('do_something_dangerous raised {!r}'.format(e))至少水平,看看发生了什么。 -
另外,请注意,在 Ned 的“真实”代码中,他只处理
except Exception,而不仅仅是裸露的except:。这部分是为了让他用except Exception, e:捕获异常(虽然这是一个旧博客,所以它使用旧语法;你想要except Exception as e:),部分是为了避免捕获像KeyboardInterrupt这样的东西,你很少想处理。 (当你这样做时,用except BaseException:明确表示。这在旧版 Python 中不是一个选项,但假设你正在编写,例如,2.6 或 3.0,它是。) -
@user2815780:在这种情况下,您可能希望以某种方式处理
apologize代码,因此您可以引发异常,让您编码/最终用户知道您失败然后失败清理。 (或者也许在目标驱动器/文件系统上的临时位置创建文件夹,这样最坏的情况就不会那么糟糕,也许不必报告。)但除此之外,是的,这是对异常的完全合理的使用- 处理可能引发的代码。
标签: python exception throw rethrow