我正在使用Twister構建服務器。我也維護一個服務器錯誤日誌。問題是,如果我讓一個異常一直運行到堆棧,它會崩潰當前連接並斷開用戶連接,所以顯然我附加一個裸機,除了抓住其他所有東西。從異常中追溯而不重新引發它們
一旦我找到了一些東西,有沒有辦法將traceback作爲一個字符串存儲起來,這樣我就可以將它存儲在某個地方/自己打印,而不用提高它並讓Python在程序崩潰時將其打印出來。
我正在使用Twister構建服務器。我也維護一個服務器錯誤日誌。問題是,如果我讓一個異常一直運行到堆棧,它會崩潰當前連接並斷開用戶連接,所以顯然我附加一個裸機,除了抓住其他所有東西。從異常中追溯而不重新引發它們
一旦我找到了一些東西,有沒有辦法將traceback作爲一個字符串存儲起來,這樣我就可以將它存儲在某個地方/自己打印,而不用提高它並讓Python在程序崩潰時將其打印出來。
回溯模塊包含印刷和檢查回溯(用於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有打印到內的標準輸出除外子句回溯。
是的,那裏有一個module。 traceback
模塊包含打印或格式化異常信息的功能,或者返回原始堆棧幀,以便您可以隨心所欲地執行任何操作。
對於一個相當複雜的應用程序,雖然我實際上會建議使用日誌記錄系統而不是普通的舊功能traceback
函數。特別是方法logging.Logger.exception
會將您有關異常的信息寫入您(或您的軟件用戶)配置的任何日誌記錄目標。默認的格式化程序只會打印出一個回溯,就像Python會在控制檯上一樣,但是您可以通過創建Formatter
並覆蓋format_exception
方法來自定義日誌中的例外情況顯示。如果您需要它們來格式化異常輸出,則您重寫的方法是調用traceback
函數的地方。
使用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)
試試這個:
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)
這應該做的伎倆,並打印完整的堆棧跟蹤過。
這是完美的,非常感謝! – xanderflood 2012-01-10 02:39:11