【发布时间】:2013-08-13 20:34:39
【问题描述】:
我知道,如果我想重新引发异常,我只需在相应的 except 块中使用不带参数的 raise。但是给定一个像
try:
something()
except SomeError as e:
try:
plan_B()
except AlsoFailsError:
raise e # I'd like to raise the SomeError as if plan_B()
# didn't raise the AlsoFailsError
如何在不破坏堆栈跟踪的情况下重新提升 SomeError?在这种情况下,仅raise 将重新提出最近的AlsoFailsError。或者我怎样才能重构我的代码来避免这个问题?
【问题讨论】:
-
您是否尝试将
plan_B放在另一个函数中,该函数在成功时返回True,在异常时返回False?那么外部except块可能只是if not try_plan_B(): raise -
@DrewMcGowen 不幸的是,更现实的情况是,这是在接受任意对象
arg的函数内部,我会尝试调用arg.plan_B(),这可能会引发AttributeError,因为arg不是提供B计划 -
@Paco 谢谢,我会的(虽然an answer 已经展示了一种更简单的方法)
-
@DrewMcGowen 我写了an answer based on your comment,虽然它看起来不像user4815162342's answer 那样pythonic。但那是因为我也想有一个返回值并允许
plan_B引发异常
标签: python exception nested raise