13

說我有一些像這樣的代碼:蟒蛇:從try塊恢復異常,如果finally塊產生異常

try: 
    try: 
     raise Exception("in the try") 
    finally: 
     raise Exception("in the finally") 
except Exception, e: 
    print "try block failed: %s" % (e,) 

輸出是:

try block failed: in the finally 

從這個print語句的一點,就是有什麼辦法可以訪問try中引發的異常,或者它永遠消失了嗎?

注意:我沒有考慮用例;這只是好奇心。

回答

14

我無法找到任何有關這是否已經被移植並沒有安裝的Py2得心應手,但在Python 3,e有一個名爲e.__context__的屬性,以便於:

try: 
    try: 
     raise Exception("in the try") 
    finally: 
     raise Exception("in the finally") 
except Exception as e: 
    print(repr(e.__context__)) 

給:

Exception('in the try',) 

PEP 3314,加入__context__之前,有關原始異常的信息是不可用的。

+0

不錯,但只有py3。反正:+1。 – ch3ka 2012-04-20 14:57:13

+1

啊,很好。所以根據該PEP,答案是,「你不能,在Py2中,但你可以在Py3中」。謝謝! – Claudiu 2012-04-20 15:26:35

0
try: 
    try: 
     raise Exception("in the try") 
    except Exception, e: 
     print "try block failed" 
    finally: 
     raise Exception("in the finally") 
except Exception, e: 
    print "finally block failed: %s" % (e,) 

然而,這將是避免代碼,很可能會拋出異常的finally塊一個好主意 - 通常你只是用它做清理等無妨。

+2

它只是吞下try中的''異常,然後纔到達finally塊。 – 2013-08-22 07:45:37