2010-01-05 102 views
17

我有一個程序,其中的一部分執行循環。在執行此循環期間,有例外。顯然,我希望我的程序運行沒有錯誤,但爲了進步,我希望程序執行整個輸入,而不是在拋出異常時停止。最簡單的方法是通過執行except塊。處理任意異常,打印默認異常消息

但是,當我這樣做時,它的所有異常,並繼續與該程序,我永遠不會看到異常消息,我需要調試。

是否有辦法except任意例外,並能夠在except塊中打印出異常消息?

回答

17
try: 
    #stuff 
except Exception as e: 
    print e 

traceback模塊提供的各種功能,用於從異常對象(e,同上)提取更多的信息。

來源Errors and Exceptions

+3

請注意,'Exception,e'語法從2.6開始不推薦使用,從3.0開始停止工作。如果您的代碼必須兼容2.x和3.x,請使用'Exception as e'代替。 (但是,如果您需要使用2.5或更低版本,則必須使用此語法。) – abarnert 2013-01-23 19:55:45

4
while True: 
    try: 
     # Do your stuff 
    except Exception, e: 
     print "Something happened: %s" % e 
+1

在Python 3中,改用'print(「發生了什麼:{}」。format(e))'。 – amicitas 2013-01-16 17:17:13

12

考慮使用Python記錄模塊,這是給你很多的功能,日誌後檢查中存在問題。下面是一個使用日誌模塊來記錄異常的一個簡單的例子:

import logging 
LOG_FILE = '/tmp/exceptions.log' 
logging.basicConfig(filename=LOG_FILE,level=logging.ERROR) 

while True: 
try: 
    # Code that may throw exceptions 
except Exception, e: 
    logging.exception("An exception happened") 

通過使用作爲都是在這裏完成的異常信息被自動添加到日誌消息的異常處理程序中的logging.exception功能。

4

我覺得這是更加有用的調試:

from traceback import print_exc 
try: 
    raise Exception("doh!") 
except: 
    print_exc() 
6

雖然詹姆斯的答案几乎總是你真正想要的東西,這不是很什麼OP問:

有除了任何異常之外並且能夠在except塊中打印出異常消息的方法嗎?

Exception實際上並不處理所有例外,只是你平時想捕獲所有異常。特別是在2.5及更高版本中:

所有內置的非系統退出異常都是從這個類派生的。所有用戶定義的異常也應該從這個類派生。

這留下了幾件事情:

  • 內置系統退出的異常,像KeyboardInterrupt從用戶擊中^C(2.5及更高版本)
  • 用戶定義的異常,唐「T遵循‘應該’

非常偶然,要處理類似的事情KeyboardInterrupt,在這種情況下,你使用的BaseException代替Exception。(對於一個列表,其中的例外是,並不Exception子見Exception hierarchy)。所以:

try: 
    # stuff 
except BaseException as e: 
    print e 

和(通常暫時在調試時),有時你確實要處理絕對一切。在2.7中,包括定義爲舊式類的異常;在2.5及更早版本中,它還包含字符串。處理所有這些可能性的唯一方法是使用裸except然後用sys.exc_info(和可選,重新raise任何你不想處理):

try: 
    # stuff 
except: 
    type, value, traceback = sys.exc_info() 
    print value 

作爲一個方面說明,我使用上面的新式except語法(except Exception as e)。這適用於2.6及更高版本,包括3.x.舊式語法(except Exception, e)在2.6中不推薦使用,並且在3.0中停止工作,但如果要使用較舊的2.x版本,則需要使用它。