2013-03-25 33 views
31

在交互式提示符(REPL)調試Python代碼時,通常會編寫一些引發異常的代碼,但我沒有將它包裝在try/except中,所以一旦出現錯誤,我就永遠失去了異常對象。如何在Python提示符下發生錯誤後獲取最後一個異常對象?

通常Python打印出來的追溯和錯誤信息是不夠的。例如,當獲取一個URL時,服務器可能會返回一個40x錯誤,並且您需要通過error.read()的響應內容...但您還沒有收到錯誤對象。例如:

>>> import urllib2 
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    ... 
urllib2.HTTPError: HTTP Error 400: Bad Request 

Drat,迴應的內容是什麼意思?它可能有它寶貴的錯誤信息...

我意識到它通常很容易重新運行你的代碼包裝在一個嘗試/除了,但這並不理想。我也意識到,在這個特定的情況下,如果我使用requests庫(它不會引發HTTP錯誤),我不會遇到這個問題......但我真的想知道是否有更一般的方法來獲取這些情況下,在Python提示符下的最後一個異常對象。

回答

44

sys模塊提供了一些用於異常事件檢查的功能:sys.last_type,sys.last_valuesys.last_traceback

sys.last_value是你正在尋找的。

+1

非常好,謝謝!按文件記錄工作。奇怪我的谷歌搜索沒有發現,但哦。 (儘管作爲一名經驗豐富的Python開發人員,我每天都會學習Python或其標準庫......) – 2013-03-25 01:39:46

+0

@BenHoyt根據'sys'的文檔,僅供參考「這三個僅在交互式會話中可用回溯已被打印。「 – satoru 2014-02-07 02:21:46

+1

@satoru很明顯。在正常程序中,未處理的異常將終止程序。 – Cairnarvon 2014-02-07 10:50:57

4

作爲@Cairnarvon提到,我沒有發現任何last_value成員是sys模塊。

sys.exc_info()爲我做了詭計。 sys.exc_info()返回三個值爲(type, value, traceback)的元組。

因此sys.exc_info()[1]會給出可讀的錯誤。下面是示例,

import sys 
list = [1,2,3,4] 
try: 
    del list[8] 
except Exception: 
    print(sys.exc_info()[1]) 

將輸出list assignment index out of range

另外,從traceback.format_exc()traceback模塊可以用來打印出類似的信息。

下面是如果使用fortmat_exec()輸出,

Traceback (most recent call last): File "python", line 6, in <module> IndexError: list assignment index out of range

相關問題