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代码解决RenderView窗口not found问题
Aug 28 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
python抽取指定url页面的title方法
May 11 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
numpy数组广播的机制
Jul 12 Python
导入tensorflow时报错:cannot import name 'abs'的解决
Oct 10 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
keras.layer.input()用法说明
Jun 16 Python
python开根号实例讲解
Aug 30 Python
Django 用户认证Auth组件的使用
Nov 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
基于文本的访客签到簿
2006/10/09 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python交易记录整合交易类详解
2019/07/03 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
用canvas显示验证码的实现
2020/04/10 HTML / CSS
是否有自动比较结构的方法
2015/06/03 面试题
美术专业学生个人自我评价
2013/09/19 职场文书
幼儿园开学家长寄语
2014/01/19 职场文书
大专学生求职自荐信
2014/07/06 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
经典导游欢迎词
2015/01/26 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫