使用sys.excepthook函數進行全局異常的獲取。
1. 使用MessageDialog實現異常顯示;
2. 使用logger把捕獲的異常信息輸出到日志中;
步驟:定義異常處理函數, 并使用該函來替換掉系統的內置處理函數;
對于threading.py的異常捕獲,需要對該文件進行一些改變:
如下:
try:
self.run()
except SystemExit:
if __debug__:
self._note("%s.__bootstrap(): raised SystemExit", self)
except:
if __debug__:
self._note("%s.__bootstrap(): unhandled exception", self)
# If sys.stderr is no more (most likely from interpreter
# shutdown) use self.__stderr. Otherwise still use sys (as in
# _sys) in case sys.stderr was redefined since the creation of
# self.
if _sys:
if id(_sys.excepthook) != id(_sys.__excepthook__):
exc_type, exc_value, exc_tb = self.__exc_info()
_sys.excepthook(exc_type, exc_value, exc_tb)
_sys.stderr.write("Exception in thread %s:\n%s\n" %
(self.name, _format_exc()))
#-*- coding: UTF-8 -*-
#-------------------------------------------------------------------------------
# Name: 模塊except hook handler
# Purpose: 全局捕獲異常
#
# Author: ankier
#
# Created: 17-08-2013
# Copyright: (c) ankier 2013
# Licence:
#-------------------------------------------------------------------------------
import logging
import sys
import traceback
import datetime
import wx
## @detail 創建記錄異常的信息
class ExceptHookHandler(object):
## @detail 構造函數
# @param logFile: log的輸入地址
# @param mainFrame: 是否需要在主窗口中彈出提醒
def __init__(self, logFile, mainFrame = None):
self.__LogFile = logFile
self.__MainFrame = mainFrame
self.__Logger = self.__BuildLogger()
#重定向異常捕獲
sys.excepthook = self.__HandleException
## @detail 創建logger類
def __BuildLogger(self):
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.FileHandler(self.__LogFile))
return logger
## @detail 捕獲及輸出異常類
# @param excType: 異常類型
# @param excValue: 異常對象
# @param tb: 異常的trace back
def __HandleException(self, excType, excValue, tb):
# first logger
try:
currentTime = datetime.datetime.now()
self.__Logger.info('Timestamp: %s'%(currentTime.strftime("%Y-%m-%d %H:%M:%S")))
self.__Logger.error("Uncaught exception:", exc_info=(excType, excValue, tb))
self.__Logger.info('\n')
except:
pass
# then call the default handler
sys.__excepthook__(excType, excValue, tb)
err_msg = ''.join(traceback.format_exception(excType, excValue, tb))
err_msg += '\n Your App happen an exception, please contact administration.'
# Here collecting traceback and some log files to be sent for debugging.
# But also possible to handle the error and continue working.
dlg = wx.MessageDialog(None, err_msg, 'Administration', wx.OK | wx.ICON_ERROR)
dlg.ShowModal()
dlg.Destroy()
輸出效果:
log輸出文件: