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正则分析nginx的访问日志
Jan 17 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
python 日期操作类代码
May 05 Python
Python中.join()和os.path.join()两个函数的用法详解
Jun 11 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
手写一个python迭代器过程详解
Aug 27 Python
通过实例了解Python str()和repr()的区别
Jan 17 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
Dec 09 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 文件上传功能实现代码
2009/06/24 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
express express-session的使用小结
2018/12/12 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
python中update的基本使用方法详解
2019/07/17 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
利用python实现汉诺塔游戏
2021/03/01 Python
一套中级Java程序员笔试题
2015/01/14 面试题
材料物理专业个人求职信
2013/12/15 职场文书
校园创业策划书
2014/01/14 职场文书
超市国庆节促销方案
2014/02/20 职场文书
消防工作实施方案
2014/06/09 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
单位车辆管理制度
2015/08/05 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
Python学习开发之图形用户界面详解
2021/08/23 Python
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android