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爬虫
Dec 25 Python
python3简单实现微信爬虫
Apr 09 Python
python爬虫爬取快手视频多线程下载功能
Feb 28 Python
python set内置函数的具体使用
Jul 02 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
Apr 20 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
python安装cx_Oracle和wxPython的方法
Sep 14 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
JSON相关知识汇总
2015/07/03 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python性能优化技巧
2015/03/09 Python
python实现的文件同步服务器实例
2015/06/02 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
学校食堂采购员岗位职责
2013/12/05 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
目标责任书范文
2014/04/14 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
幼师大班个人总结
2015/02/13 职场文书
公司员工离职感言
2015/08/03 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
JS中如何优雅的使用async await详解
2021/10/05 Javascript