python 追踪except信息方式


Posted in Python onApril 25, 2020

看下面这个函数

def test():
 sum = 3/0
 
if __name__ == '__main__':
 test()

除0肯定是不对的,会引发一个except,内容如下:

File "E:\Src\dongsheng\TestPython\testtrace_back.py", line 23, in <module>
test()
File "E:\Src\dongsheng\TestPython\testtrace_back.py", line 19, in test
sum = 3/0
ZeroDivisionError: integer division or modulo by zero

上面的提示,是在IDE中运行时出现的,实际在线上运行脚本时,一般会用nohup 方式启动,输出内容会写入到nohup.out文件中,但这个文件里的内容可能非常多,很杂乱,不利于异常的排查。

python 提供了traceback ,可以完美的输出except发生时的信息,就和上面的内容一样,而且可以输入到指定的文件之中,所以,不妨写一个装饰器,修饰那些需要监督的函数,当他们发生异常时,记录下有关异常的信息。

#coding=utf-8
from functools import wraps
import traceback
 
def except_trace(filename):
 def decorate(func):
  @wraps(func)
  def wrapper(*args,**kwargs):
   try:
    func(*args,**kwargs)
   except:
    fp = open(filename,'w')
    traceback.print_exc(file=fp)
    fp.close()
  return wrapper
 return decorate
@except_trace('1.txt')
def test():
 sum = 3/0
 
if __name__ == '__main__':
 test()

这一次,发生异常后,有关异常的信息会输入到1.txt文件中,这个文件中只包含异常的信息,方便查看。

补充知识:Python 的 except 怪癖

让我来展示一下我最喜欢的 Python 怪癖。你希望这段 Python 代码做什么?

如果你是从另一种编程语言过来学习 Python 的,你可能希望except子句引入嵌套范围,因此在子句中赋值给 e 不会影响外部作用域中已有的 e 变量。然而,在 Python 中,控制结构通常不引入嵌套作用域(列表推导是一个例外),所以如果你有更多的 Python 经验,你可能会期望它打印一个ZeroDivisionError实例。

实际上,在标准 CPython 实现中,它什么也不打印;同时,最后一行将引发一个NameError。这是一个 bug 吗?事实上,这是故意的。如果查看 except 子句生成的字节码,可以看到:

当控制流退出except块时,Python 将从作用域中删除该名称。为什么?因为异常持有对当前栈帧的引用,该栈帧包含作用域内的所有内容。由于Python主要是通过引用计数来管理内存主体的,这意味着当前作用域内的任何内容都不会被释放,直到下一轮垃圾收集运行 (如果有的话)。目前的行为是内存使用、易于实现和语言整洁之间的折衷。它有点缺点,但我认为它体现了我喜欢Python的一点:不让纯粹性妨碍实用性。

但这只解释了DELETE_NAME指令。为什么 CPython 把e设为None,即便随后立即就删除了这个变量?好吧,设想你和 CPython 团队有相同的想法,并且决定在 except 块的末尾清理异常引用:

在except块的末尾,CPython 将尝试删除你已经删除的名字e!为了解决这个问题,CPython 在删除e之前赋值e = None,以确保e存在。

以上这篇python 追踪except信息方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python连接mongodb操作数据示例(mongodb数据库配置类)
Dec 31 Python
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
详解Python中列表和元祖的使用方法
Apr 25 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
Python中对象的引用与复制代码示例
Dec 04 Python
python的socket编程入门
Jan 29 Python
python将时分秒转换成秒的实例
Dec 07 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
手残删除python之后的补救方法
Jun 26 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 #Python
python IDLE添加行号显示教程
Apr 25 #Python
IDLE下Python文件编辑和运行操作
Apr 25 #Python
python 字典item与iteritems的区别详解
Apr 25 #Python
解决reload(sys)后print失效的问题
Apr 25 #Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 #Python
500行python代码实现飞机大战
Apr 24 #Python
You might like
PHP的开发框架的现状和展望
2007/03/16 PHP
PHP中的Memcache详解
2014/04/05 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
Prototype Selector对象学习
2009/07/23 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Python 字典dict使用介绍
2014/11/30 Python
深入浅析Python的类
2018/06/22 Python
python pandas模块基础学习详解
2019/07/03 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
哪些是python中web开发框架
2020/06/17 Python
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
2014年公司迎新年活动方案
2014/02/24 职场文书
情人节寄语大全
2014/04/11 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
社区宣传标语口号
2015/12/26 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
python绘制箱型图
2021/04/27 Python
Python anaconda安装库命令详解
2021/10/16 Python