python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中
使用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日志中的更多相关文章
- ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常
在ASP.NET MVC中,通过应用程序生命周期中的Application_Error事件可以捕获到网站引发的所有未处理异常.本文作为学习笔记,记录了使用Global.asax文件的Applicati ...
- ng1中 如何用双向绑定 实现单向绑定的初始时不显示双括号效果?
ng1中 如何用双向绑定 实现单向绑定(ng-bind就可以不显示{{}})的初始时不显示双括号效果? AngularJS 实例 页面加载时防止应用闪烁: <div ng-app="& ...
- Python中模块之sys的功能介绍
sys模块的功能介绍 1. sys的变量 argv 命令行参数 方法:sys.argv 返回值:list 例如:test1.py文件中有两句语句1.import sys 2.print(sys.arg ...
- python中os与sys作用与区别
https://www.cnblogs.com/cloak/p/11237285.html OS模块 在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告( ...
- Python中 os._exit() sys.exit() exit()区别
Python退出程序的方式有两种:os._exit(), sys.exit() 1)os._exit() 直接退出 Python程序,其后的代码也不会继续执行. 2)sys.exit() 引发一个 S ...
- Python中os和sys模块中常用的方法
os模块 os模块:该模块提供了一些方便使用操作系统相关功能的函数 os.remove() 删除文件 os.rename() 重命名文件 os.walk() 文件目录遍历器 os.chdir() 改变 ...
- Python常用模块之sys
Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...
- Python标准库之Sys模块使用详解
sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sy ...
- 多线程&多进程解析:Python、os、sys、Queue、multiprocessing、threading
当涉及到操作系统的时候,免不了要使用os模块,有时还要用到sys模块. 设计到并行程序,一般开单独的进程,而不是线程,原因是python解释器的全局解释器锁GIL(global interpreter ...
随机推荐
- js日期控件demo
最近在钻研前端,写了个日期控件,内涵代码注释,希望能帮助到大家~ 1.html代码 <!DOCTYPE html> <html xmlns="http://www.w3.o ...
- IOS中UITableViewCell的重用机制原理
创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableVie ...
- Hibernate知识点总结
Hibernate配置二级缓存: --- 使用EhCache 1.hibernate.cfg.xml中配置二级缓存 <hibernate-configuration> <ses ...
- android AppWidgwtProvider学习
实现AppWidgwtProvider: onUpdate() //在达到制定的更新时间之后或者当用户向桌面添加 App Widget时会调用该方法. onDeleted() //当App Wid ...
- FACTORY设计模式【让吃货也能理解的程序】
一个人要有思想,技术再牛的人,如果没有一点点文化气氛,那么也是个码农,不能追到女朋友滴. 我这个人文化真心不多,但是比较喜欢读古诗文.虽然读完之后,记在脑海里的不多,不过,就讨一个喜欢[读]. Lee ...
- phpcms如何嵌套循环
PHPCMS V9的标签制作以灵活见长,可以自由DIY出个性的数据调用,对于制作有风格有创意的网站模板很好用,今天就介绍一个标签循环嵌套方法,可以实现对PC标签循环调用,代码如下: 在此文件里/php ...
- NSIndexPath初始化
在UITableView中经常用到这个类,但一直不知道怎么初始化,网上抄录的代码如下,果然好用 NSIndexPath *index = [NSIndexPath indexPathForRow:0 ...
- 每天一条Linux命令(OS X系统上操作)
Linux菜鸟必学的60个命令 安装和登录命令:login.shutdown.halt.reboot.install.mount.umount.chsh.exit.last: 文件处理命令:file ...
- codevs1044四子连棋(Dfs)
/* 数据范围太小 暴力暴力 Dfs直接 终止条件嘛 就是4中目标棋局 挨着枚举一遍就好了 搜索的起点一定是空格 当然 空格周围有黑有白 黑先走或者白先走答案可能不一样 所以 维护一个b 表示这一步走 ...
- My.Ioc 代码示例——谈一谈如何实现装饰器模式,兼谈如何扩展 My.Ioc
装饰器模式体现了一种“组合优于继承”的思想.当我们要动态为对象增加新功能时,装饰器模式往往是我们的好帮手. 很多后期出现的 Ioc 容器都为装饰器模式提供了支持,比如说 Autofac.在 My.Io ...