在Python中传递异常

时间:2011-01-19 00:01:12

标签: python exception-handling

我有一些代码可以执行一些功能异常处理,一切运行正常,当我想要它们时会引发异常,但是当我调试时,行跟踪并不总是完全符合我的要求他们来。

示例A:

>>> 3/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

例B:

>>> try: 3/0
... except Exception as e: raise e
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero

在这两个示例中,异常实际发生在第1行,我们尝试执行3/0,但在后一个示例中,我们被告知它已经发生在第2行,它被引发。

Python中有没有办法引发异常,好像它是另一个异常,会产生以下输出:

>>> try: 3/0
... except Exception as e: metaraise(e)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

2 个答案:

答案 0 :(得分:22)

当您重新引发捕获的异常时,例如

except Exception as e: raise e

它重置堆栈跟踪。这就像重新提出一个新的例外。你想要的是这个:

except Exception as e: raise

答案 1 :(得分:5)

作为参考,解决方案大致如下:

def getException():
    return sys.exc_info()

def metaraise(exc_info):
    raise exc_info[0], exc_info[1], exc_info[2]

try: 3/0
except:
    e = getException()
    metaraise(e)

这个很漂亮的部分就是你可以传递变量e并将其元化到其他地方,即使在此过程中遇到了其他异常。