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

2020/12/01 00:31 · python ·  · 0评论

我知道,如果我想重新引发异常,我会raise在相应的except块中简单地使用没有参数的方法但是给定一个嵌套的表达式

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

产生的追溯将包括SomeError在处理过程发生的其他通知AlsoFailsError(由于位于raise e内部except AlsoFailsError)。这具有误导性,因为实际发生的是相反的情况-我们AlsoFailsError在尝试从恢复时遇到并处理了它SomeError要获取不包含的回溯AlsoFailsError,请替换raise eraise e from None

在Python 2中,您将异常类型,值和回溯存储在局部变量中,并使用以下三个参数的形式raise

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

即使公认的解决方案正确,也最好使用指向具有Python 2 + 3解决方案Sixsix.reraise

六。提高exc_typeexc_valueexc_traceback = None)

重新引发异常,可能使用不同的回溯。[...]

因此,您可以编写:

import six


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

根据Drew McGowen的建议,但考虑到一般情况(存在返回值s),这是user4815162342的替代方法

try:
    s = something()
except SomeError as e:
    def wrapped_plan_B():
        try:
            return False, plan_B()
        except:
            return True, None
    failed, s = wrapped_plan_B()
    if failed:
        raise

Python 3.5+无论如何都会将追溯信息附加到错误,因此不再需要单独保存它。

>>> def f():
...   try:
...     raise SyntaxError
...   except Exception as e:
...     err = e
...     try:
...       raise AttributeError
...     except Exception as e1:
...       raise err from None
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in f
  File "<stdin>", line 3, in f
SyntaxError: None
>>> 
本文地址:http://python.askforanswer.com/ruhezaiqiantaodetry-exceptkuaizhongzhongxinyinfayichang.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!