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实现计算资源图标crc值的方法
Oct 05 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
Jan 27 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
pyspark给dataframe增加新的一列的实现示例
Apr 24 Python
pytorch快速搭建神经网络_Sequential操作
Jun 17 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 Python
再谈python_tkinter弹出对话框创建
Mar 20 Python
python中redis包操作数据库的教程
Apr 19 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类
2008/04/09 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
PHP输出日历表代码实例
2015/03/27 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
PHP的PDO连接讲解
2019/01/24 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
Python导入oracle数据的方法
2015/07/10 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
职业培训师职业生涯规划
2014/02/18 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
超市店庆活动方案
2014/08/31 职场文书
合作经营协议书范本
2014/09/16 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
小学安全工作总结2015
2015/05/18 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers