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程序设计入门(2)变量类型简介
Jun 16 Python
Unicode和Python的中文处理
Mar 19 Python
Python使用剪切板的方法
Jun 06 Python
Django自定义分页效果
Jun 27 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python当中的array数组对象实例详解
Jun 12 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
django下创建多个app并设置urls方法
Aug 02 Python
python 如何快速复制序列
Sep 07 Python
Python3接口性能测试实例代码
Jun 20 Python
Python学习之时间包使用教程详解
Mar 21 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目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
js left,right,mid函数
2008/06/10 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Python中super函数用法实例分析
2019/03/18 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
softmax及python实现过程解析
2019/09/30 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
美容院店长岗位职责
2014/04/08 职场文书
文明村镇申报材料
2014/05/06 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
公司财务部岗位职责
2015/04/14 职场文书
高一军训感想
2015/08/07 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
Pandas自定义选项option设置
2021/07/25 Python
MySQL里面的子查询的基本使用
2021/08/02 MySQL
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android