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初学者的一些编程技巧
Apr 03 Python
Python中的集合类型知识讲解
Aug 19 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
对Python w和w+权限的区别详解
Jan 23 Python
Python制作exe文件简单流程
Jan 24 Python
使用Python 统计高频字数的方法
Jan 31 Python
Python当中的array数组对象实例详解
Jun 12 Python
wxPython实现画图板
Aug 27 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 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
php实现的常见排序算法汇总
2014/09/08 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
新浪的图片新闻效果
2007/01/13 Javascript
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
jQuery动态添加
2016/04/07 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
编程语言Python的发展史
2014/09/26 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
python调试神器PySnooper的使用
2019/07/03 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
一套SQL笔试题
2016/08/14 面试题
linux面试题参考答案(8)
2016/04/19 面试题
会计专业自荐信范文
2013/12/02 职场文书
日语专业个人的求职信
2013/12/03 职场文书
班主任评语大全
2014/04/26 职场文书
实习单位评语
2014/04/26 职场文书
企业安全生产承诺书
2014/05/22 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
离婚协议书怎么写
2015/01/26 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL