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进程的信号通讯
Apr 09 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
详解python的webrtc库实现语音端点检测
May 31 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
带你认识Django
Jan 15 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
Tensorflow训练MNIST手写数字识别模型
Feb 13 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
django下创建多个app并设置urls方法
Aug 02 Python
python 模拟登陆github的示例
Dec 04 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注入点构造代码
2008/06/14 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
星球大战与Python之间的那些事
2016/01/07 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
自定义django admin model表单提交的例子
2019/08/23 Python
基于python实现从尾到头打印链表
2019/11/02 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
房地产销售计划书
2014/01/10 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android
MySQL修炼之联结与集合浅析
2021/10/05 MySQL