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文件与文件夹常见基本操作总结
Sep 19 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
Python实现修改文件内容的方法分析
Mar 25 Python
Python发送http请求解析返回json的实例
Mar 26 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
Python实现计算字符串中出现次数最多的字符示例
Jan 21 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
pip安装python库的方法总结
Aug 02 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
Python基于numpy模块实现回归预测
May 14 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
理解python中生成器用法
2017/12/20 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
django框架cookie和session用法实例详解
2019/12/10 Python
python使用Geany编辑器配置方法
2020/02/21 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
生产部经理岗位职责
2013/12/16 职场文书
求职信内容怎么写
2014/05/26 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
政协工作总结2015
2015/05/20 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Ruby处理YAML和json数据
2022/04/18 Ruby