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中的集合类型操作符
Aug 19 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
python贪吃蛇游戏代码
Apr 18 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
简单了解django缓存方式及配置
Jul 19 Python
Django用户认证系统 组与权限解析
Aug 02 Python
QML使用Python的函数过程解析
Sep 26 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
Mar 06 Python
python如何求圆的面积
Jul 01 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 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
星际中的相关伤害
2020/03/04 星际争霸
用PHP开发GUI
2006/10/09 PHP
使用数据库保存session的方法
2006/10/09 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
js读写json文件实例代码
2014/10/21 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
JS中sort函数排序用法实例分析
2016/06/16 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
基于javascript实现数字英文验证码
2017/01/25 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
Python 文件重命名工具代码
2009/07/26 Python
python使用scrapy解析js示例
2014/01/23 Python
Python正则简单实例分析
2017/03/21 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
公务员政审单位鉴定材料
2014/05/16 职场文书
超市创业计划书
2014/09/15 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
客房部经理岗位职责
2015/02/02 职场文书
团员个人年度总结
2015/02/26 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js