python 追踪except信息方式
作者:酷python 发布时间:2022-10-07 13:46:02
看下面这个函数
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存在。
来源:https://blog.csdn.net/KWSY2008/article/details/51881551


猜你喜欢
- Python实现图像处理:PiL依赖库的应用本文包含的练习题主要是PIL依赖库,即pillow相关的应用。练习一:使用python给图片增加
- 本文介绍的是Golang使用 os/exec 来执行 Linux 命令,分享出来供大家参考学习,下面来看看详细的介绍:下面是一个简单的示例:
- 很多时候我们需要让main函数不退出,让它在后台一直执行,例如:func main() { for i := 0;
- int connectDb() { EXEC SQL BEGIN DECLARE SECTION; char username[20]; c
- 一、基础知识1、MySQL-python的安装下载,然后 pip install 安装包2、python编写通用数据库程序的API规范(1)
- Python 相对路径报错:"No such file or directory"'原因及解决方法如果你取相对路
- 百度,谷歌之后都说用setHintSize(self,QCore.QSize(width,height)),然并卵,后来用qss修改就可以了
- 安装sql server 2008 management,提示错误:Sql2005SsmsExpressFacet 检查是否安装了 SQL
- 修改密码://选择数据库use mysql;//修改密码update user set password=password('新密码
- 给定一篇英语文章,要求统计出所有单词的个数,并按一定次序输出。思路是利用go语言的map类型,以每个单词作为关键字存储数量信息,代码实现如下
- 初学Python,在网上看到Python图片转字符画的教程,我也来尝试下。 首先我们要用到Python的PIL库的Image模块,PIL(P
- 这几天看了一下JavaScript高级程序设计中的Dom事件相关内容,同时看到网上有关鼠标多次点击事件,鼠标事件是简单、常用的事件之一,于是
- 一、回顾一下CONVERT()的语法格式:CONVERT (<data_ type>[ length ], <expres
- 现在是好时机来指出Django和URL配置背后的哲学: 松耦合 原则。 简单的说,松耦合是一个 重要的保证互换性的软件开发方法。Django
- 前言我是一个半路出家的PHP程序员,到目前为止,不算在培训班学习的时间,已经写代码整整两年了。可能由于工作业务的原因,在这两年中我没有用到过
- 1.在模板中,我们经常要使用一些url,实现页面之间的跳转,比如某个a标签中需要定义href属性。当然如果通过硬编码的方式直接将这个url固
- 你是怎么把密码储存到数据库里?是以纯文字的方式?你可知道这对安全的危险性?当攻击你网站的人能开启数据库浏览,以纯文字方式存在数据库里的密码一
- 最近在倒腾一个txt文件,因为文件太大,所以给切割成了好几个小的文件,只有第一个文件有标题,从第二个开始就没有标题了。我的需求是取出指定的列
- 本文实例讲述了python概率计算器实现方法。分享给大家供大家参考。具体实现方法如下:from random import randrang
- Python爬虫包 BeautifulSoup 递归抓取实例详解概要:爬虫的主要目的就是为了沿着网络抓取需要的内容。它们的本质是