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 相关文章推荐
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
django之状态保持-使用redis存储session的例子
Jul 28 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
Python BeautifulReport可视化报告代码实例
Apr 13 Python
Python如何在main中调用函数内的函数方式
Jun 01 Python
python 实现的IP 存活扫描脚本
Dec 10 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
Django中的DateTimeField和DateField实现
Feb 24 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 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
php框架Phpbean说明
2008/01/10 PHP
php中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
探讨如何把session存入数据库
2013/06/07 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
浅谈react路由传参的几种方式
2021/03/23 Javascript
《小动物过冬》教学反思
2014/04/17 职场文书
大型营销活动计划书
2014/04/28 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
爱心捐书倡议书
2015/04/27 职场文书
办公用品质量保证书
2015/05/11 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL