使用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: <your 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输出文件:

python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中的更多相关文章

  1. ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常

    在ASP.NET MVC中,通过应用程序生命周期中的Application_Error事件可以捕获到网站引发的所有未处理异常.本文作为学习笔记,记录了使用Global.asax文件的Applicati ...

  2. ng1中 如何用双向绑定 实现单向绑定的初始时不显示双括号效果?

    ng1中 如何用双向绑定 实现单向绑定(ng-bind就可以不显示{{}})的初始时不显示双括号效果? AngularJS 实例 页面加载时防止应用闪烁: <div ng-app="& ...

  3. Python中模块之sys的功能介绍

    sys模块的功能介绍 1. sys的变量 argv 命令行参数 方法:sys.argv 返回值:list 例如:test1.py文件中有两句语句1.import sys 2.print(sys.arg ...

  4. python中os与sys作用与区别

    https://www.cnblogs.com/cloak/p/11237285.html OS模块 在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告( ...

  5. Python中 os._exit() sys.exit() exit()区别

    Python退出程序的方式有两种:os._exit(), sys.exit() 1)os._exit() 直接退出 Python程序,其后的代码也不会继续执行. 2)sys.exit() 引发一个 S ...

  6. Python中os和sys模块中常用的方法

    os模块 os模块:该模块提供了一些方便使用操作系统相关功能的函数 os.remove() 删除文件 os.rename() 重命名文件 os.walk() 文件目录遍历器 os.chdir() 改变 ...

  7. Python常用模块之sys

    Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...

  8. Python标准库之Sys模块使用详解

    sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sy ...

  9. 多线程&多进程解析:Python、os、sys、Queue、multiprocessing、threading

    当涉及到操作系统的时候,免不了要使用os模块,有时还要用到sys模块. 设计到并行程序,一般开单独的进程,而不是线程,原因是python解释器的全局解释器锁GIL(global interpreter ...

随机推荐

  1. selenium python presence_of_element_located vs visibility_of_element_located

    背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待元素出现.结果屡屡出问题.元素默认是隐藏的,导致等待过早的就结 ...

  2. poj1013

    题目大意:假造的银币 Sally Jones有一些游客给的银币,但是只有11枚是真正的银币(有一枚是假的),从颜色和大小是无法区分真比还是假币的,但是它的重量和真币是不同的,Sally Jones它是 ...

  3. 在eclipse下编译hadoop2.0源码

    Hadoop是一个分布式系统基础架构,由apache基金会维护并更新.官网地址: http://hadoop.apache.org/ Hadoop项目主要包括以下4个模块: Hadoop Common ...

  4. java mysql模板

    Java mysql的模版,很优雅.同时也兼顾了性能PreparedStatement和安全性(防SQL注入)两方面.对于比较简单的数据库操作基本满足要求. package dao; import j ...

  5. 关于openoffice英文乱码的问题

    首先选中乱码的部分,然后在右边的侧栏中看到其字体,尝试改变它的字体,看会不会显示正常,如果可以,先记住这两种字体.然后:    工具->选项->字体        然后在使用替换表打上勾, ...

  6. Java里的IO流里的FileInputStream 的读取并在前打印行数!

    大家好!!新人求罩! import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException ...

  7. Bulk Insert 高效快速插入数据

    BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_nam ...

  8. GNU Make----Core Automatic Variables

    $@ 表示规则的目标文件名.如果目标是一个文档文件(Linux中,一般称.a 文件为 文档文件,也称为静态库文件),那么它代表这个文档的文件名.在多目标模式 规则中,它代表的是哪个触发规则被执行的目标 ...

  9. YYCache 源码分析(二)

    本文分析YYMemoryCache实现原理: YYMemoryCache是内存缓存,所以存取速度非常快,主要用到两种数据结构的LRU淘汰算法 1.LRU Cache的容量是有限的,当Cache的空间都 ...

  10. 2015 南阳ccpc The Battle of Chibi (uestc 1217)

    题意:给定一个序列,找出长度为m的严格递增序列的个数. 思路:用dp[i][j]表示长度为i的序列以下标j结尾的总个数.三层for循环肯定超时,首先离散化,离散化之后就可以用树状数组来优化,快速查找下 ...