在Python2中,如何在不更改其回溯的情况下引发Python错误?
在以下典型的try-except块中:在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:
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感谢它能工作(如答案中所述)。非常感谢!这是最终的答案非常感谢!这是最终的答案