在Python2中,如何在不更改其回溯的情况下引发Python错误?

在Python2中,如何在不更改其回溯的情况下引发Python错误?,python,exception,exception-handling,Python,Exception,Exception Handling,在以下典型的try-except块中: try: do something except Exception as e: {clean up resources} raise e ^ 但是,这将打印出一条错误消息,回溯指向^,在那里引发错误,与大多数其他语言不同,在大多数其他语言中,第一次生成e时的回溯将被记住并打印 Python风格的异常处理在找出错误的来源方面造成了很大的困难,我想重写它。有没有一种简单的方法可以做到这一点?要捕获异常,请对其进行

在以下典型的try-except块中:

try:
    do something
except Exception as e:
    {clean up resources}
    raise e
          ^
但是,这将打印出一条错误消息,回溯指向^,在那里引发错误,与大多数其他语言不同,在大多数其他语言中,第一次生成e时的回溯将被记住并打印


Python风格的异常处理在找出错误的来源方面造成了很大的困难,我想重写它。有没有一种简单的方法可以做到这一点?

要捕获异常,请对其进行处理,然后重新引发相同的异常:

try:
    do something
except Exception as e:
    {clean up resources}
    raise   # raises the same exception with the same traceback
要捕获异常,请引发新异常,但保留旧的回溯:

try:
    do something
except Exception as e:
    exctype, value, traceback = sys.exc_info()
    raise NewException, 'Argument for new exception', traceback
这在以下章节中进行了描述:

如果不存在表达式,raise将重新引发当前作用域中活动的最后一个异常。如果当前作用域中没有活动异常,则会引发TypeError异常,指示这是一个错误(如果在空闲状态下运行,则会引发队列。空异常)

否则,raise对表达式求值以获得三个对象,将None用作省略表达式的值。前两个对象用于确定异常的类型和值

如果存在第三个对象而不是无对象,则该对象必须是回溯对象(请参见“标准类型层次结构”一节),并将其替换为异常发生的位置,而不是当前位置

Python 3
请注意,在Python3中,从
块提升时始终保留原始回溯,但
块除外。在其他情况下,将使用来自另一个异常的语法
raiseexception()。

要捕获一个异常,请对其执行一些操作,然后重新引发相同的异常:

try:
    do something
except Exception as e:
    {clean up resources}
    raise   # raises the same exception with the same traceback
要捕获异常,请引发新异常,但保留旧的回溯:

try:
    do something
except Exception as e:
    exctype, value, traceback = sys.exc_info()
    raise NewException, 'Argument for new exception', traceback
这在以下章节中进行了描述:

如果不存在表达式,raise将重新引发当前作用域中活动的最后一个异常。如果当前作用域中没有活动异常,则会引发TypeError异常,指示这是一个错误(如果在空闲状态下运行,则会引发队列。空异常)

否则,raise对表达式求值以获得三个对象,将None用作省略表达式的值。前两个对象用于确定异常的类型和值

如果存在第三个对象而不是无对象,则该对象必须是回溯对象(请参见“标准类型层次结构”一节),并将其替换为异常发生的位置,而不是当前位置

Python 3
请注意,在Python3中,从
块提升时始终保留原始回溯,但
块除外。在其他情况下,将使用来自另一个异常的语法
raiseexception()。

是否尝试了
raise
(无参数)?它将重新抛出旧错误。对于更完整的处理,我建议使用链接异常,如所示。您是否使用了
throw
作为快速示例?只是想确保您没有试图在实际代码中使用
throw
。@idjaw很抱歉,您是对的,这是纯java肌肉内存,已更正。@Alfe感谢它可以工作(如答案中所述)。您是否尝试过
raise
(无参数)?它将重新抛出旧错误。对于更完整的处理,我建议使用链接异常,如所示。您是否使用了
throw
作为快速示例?只是想确保您没有试图在真正的代码中使用
throw
。@idjaw很抱歉,您是对的,这是纯java肌肉内存,已更正。@Alfe感谢它能工作(如答案中所述)。非常感谢!这是最终的答案非常感谢!这是最终的答案