2012-01-10 52 views
4

我正在使用Twister構建服務器。我也維護一個服務器錯誤日誌。問題是,如果我讓一個異常一直運行到堆棧,它會崩潰當前連接並斷開用戶連接,所以顯然我附加一個裸機,除了抓住其他所有東西。從異常中追溯而不重新引發它們

一旦我找到了一些東西,有沒有辦法將traceback作爲一個字符串存儲起來,這樣我就可以將它存儲在某個地方/自己打印,而不用提高它並讓Python在程序崩潰時將其打印出來。

回答

2

回溯模塊包含印刷和檢查回溯(用於exameble,traceback.print_tb)一些輔助功能 - 但重要的是,回溯信息本身存儲在模塊sys上的「解釋器全局」變量sys.exc_traceback中。

從引用:

http://docs.python.org/reference/compound_stmts.html#try

一個之前除子句的套件被執行時,關於 異常的詳細信息被分配給sys模塊中三個變量: sys.exc_type接收對象標識例外; sys.exc_value接收異常的參數; sys.exc_traceback是以 接收回溯對象...

可以傳遞sys.exc_traceback是以對象作爲參數來traceback.print_tb有打印到內的標準輸出除外子句回溯。

+0

這是完美的,非常感謝! – xanderflood 2012-01-10 02:39:11

0

是的,那裏有一個moduletraceback模塊包含打印或格式化異常信息的功能,或者返回原始堆棧幀,以便您可以隨心所欲地執行任何操作。

對於一個相當複雜的應用程序,雖然我實際上會建議使用日誌記錄系統而不是普通的舊功能traceback函數。特別是方法logging.Logger.exception會將您有關異常的信息寫入您(或您的軟件用戶)配置的任何日誌記錄目標。默認的格式化程序只會打印出一個回溯,就像Python會在控制檯上一樣,但是您可以通過創建Formatter並覆蓋format_exception方法來自定義日誌中的例外情況顯示。如果您需要它們來格式化異常輸出,則您重寫的方法是調用traceback函數的地方。

1

使用logging module,你可以log the traceback到一個文件:

import logging 
logging.basicConfig(level = logging.DEBUG, filename = logfile) 
logger = logging.getLogger(__name__) 
try: 
    1/0 
except ZeroDivisionError as err: 
    logger.exception(err) 
1

試試這個:

import traceback, sys 

try: 
    # Do something that might raise an exception 
    open("/does not exist",'rb') 
except: 
    traceback.print_exc(file=sys.stderr) 
    # Or 
    traceback.print_exc(file=your_open_log_file) 

這應該做的伎倆,並打印完整的堆棧跟蹤過。