gpt4 book ai didi

python - 如何在嵌套的 try/except block 中重新引发异常?

转载 作者:IT老高 更新时间:2023-10-28 21:34:39 25 4
gpt4 key购买 nike

我知道,如果我想重新引发异常,我只需在相应的 except block 中使用不带参数的 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。或者我怎样才能重构我的代码来避免这个问题?

最佳答案

从 Python 3 开始,回溯存储在异常中,所以一个简单的 raise e 将做(大部分)正确的事情:

try:
something()
except SomeError as e:
try:
plan_B()
except AlsoFailsError:
raise e # or raise e from None - see below

产生的回溯将包括一个额外的通知,即在处理 AlsoFailsError 时发生了 SomeError(因为 raise e除了 AlsoFailsError )。这是一种误导,因为实际发生的情况恰恰相反——我们遇到了 AlsoFailsError,并在尝试从 SomeError 中恢复时对其进行了处理。要获得不包含 AlsoFailsError 的回溯,请将 raise e 替换为 raise e from None


在 Python 2 中,您可以将异常类型、值和回溯存储在局部变量中,并使用 three-argument form of raise :

try:
something()
except SomeError:
t, v, tb = sys.exc_info()
try:
plan_B()
except AlsoFailsError:
raise t, v, tb

关于python - 如何在嵌套的 try/except block 中重新引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18188563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com