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通过字典dict判断指定键值是否存在的方法
Mar 21 Python
详解Python中的元组与逻辑运算符
Oct 13 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
Django配置celery(非djcelery)执行异步任务和定时任务
Jul 16 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
python实现大文本文件分割
Jul 22 Python
通过实例解析Python调用json模块
Dec 11 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
方法汇总:Python 安装第三方库常用
Apr 26 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判断所处服务器操作系统的类型
2013/06/20 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
jQuery中库的引用方法
2018/01/06 jQuery
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
python中快速进行多个字符替换的方法小结
2016/12/15 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
python正则实现提取电话功能
2018/02/24 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
为什么Python中没有&quot;a++&quot;这种写法
2018/11/27 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
亚马逊意大利站点:Amazon.it
2020/12/31 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
教师应聘个人求职信
2013/12/10 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
演讲稿格式范文
2014/05/19 职场文书
销售团队激励口号
2014/06/06 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
Golang二维数组的使用方式
2021/05/28 Golang
Python利用FlashText算法实现替换字符串
2022/03/31 Python