2011-01-19 43 views
14

我有一些代码可以完成一些功能异常处理,并且一切正常,当我希望它们出现时会引发异常,但是当我在调试时,线路跟踪并不总是这样相当我想要他们。在Python中传递异常

实施例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 

回答

4

供参考,该解决方案大致如下:

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和metaraise在别处即使在此过程中遇到其他例外情况。

17

当您重新抛出异常,你抓住了,如

except Exception as e: raise e 

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

except Exception as e: raise 
+1

在这种情况下,您不需要存储变量。 – 2011-01-19 00:05:01

+0

除了我需要以某种方式将它存储在一个变量中,并将它传递到某个地方,它最终会被提升。 – 2011-01-19 00:29:10