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入门篇之编程习惯与特点
Oct 17 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
Python算术运算符实例详解
May 31 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
深入浅析Python的类
Jun 22 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
Python爬虫实现验证码登录代码实例
May 10 Python
选择python进行数据分析的理由和优势
Jun 25 Python
Python Numpy库常见用法入门教程
Jan 16 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 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将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
详解a++和++a的区别
2017/08/30 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
Python中list查询及所需时间计算操作示例
2018/06/21 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
数据库面试要点基本概念
2013/10/31 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
大三学生入党思想汇报
2014/01/02 职场文书
生日邀请函范文
2014/01/13 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
营销总监岗位职责
2014/09/16 职场文书
2014个人年度工作总结
2014/12/15 职场文书
自我检讨书范文
2015/01/28 职场文书
2015年环保局工作总结
2015/05/22 职场文书
法定代表人免职证明
2015/06/24 职场文书
详解pytorch创建tensor函数
2022/03/22 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫
mysql 子查询的使用
2022/04/28 MySQL
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电