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和JavaScript间代码转换的4个工具
Feb 22 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
python+Splinter实现12306抢票功能
Sep 25 Python
Ubuntu下Python2与Python3的共存问题
Oct 31 Python
python实现可逆简单的加密算法
Mar 22 Python
Python数据类型之List列表实例详解
May 08 Python
django 单表操作实例详解
Jul 30 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
python温度转换华氏温度实现代码
Dec 06 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
PHP5 面向对象(学习记录)
2009/12/02 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
零基础php编程好学吗
2019/10/11 PHP
List Installed Software Features
2007/06/11 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
Python对列表排序的方法实例分析
2015/05/16 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
建筑专业自我鉴定
2013/10/22 职场文书
生产车间主管岗位职责
2013/12/28 职场文书
投标保密承诺书
2014/05/19 职场文书
计划生育标语
2014/06/23 职场文书
2014年司法局工作总结
2014/12/11 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
2016国培学习心得体会
2016/01/08 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python
Golang中异常处理机制详解
2021/06/08 Golang
JavaScript执行机制详细介绍
2021/12/06 Javascript
java项目构建Gradle的使用教程
2022/03/24 Java/Android