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,except
0
投稿

猜你喜欢

  • python not关键字实例用法

    2023-12-05 10:25:50
  • pytorch Dropout过拟合的操作

    2023-11-26 16:12:18
  • Yii2中SqlDataProvider用法示例

    2023-11-20 10:10:05
  • 解决python 使用openpyxl读写大文件的坑

    2021-06-20 17:03:24
  • python如何正确的操作字符串

    2023-12-28 02:46:30
  • 浅析MySQL数据库授权原则

    2009-12-15 09:21:00
  • Flask项目中实现短信验证码和邮箱验证码功能

    2022-02-24 00:12:58
  • 用1行Python代码识别身份证信息实例

    2022-04-28 12:57:27
  • python创建关联数组(字典)的方法

    2021-11-22 06:51:18
  • 仿阿里巴巴搜索导航设计效果

    2008-04-15 15:01:00
  • 古老的问题:清除浮动

    2009-02-12 11:21:00
  • Pandas+Matplotlib 箱式图异常值分析示例

    2022-09-19 08:49:39
  • 关于递归运算的顺序测试代码

    2023-08-24 13:04:16
  • php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程

    2023-11-14 22:08:47
  • Python reflect单例模式反射各个函数

    2022-11-11 08:52:51
  • 用Python制作在地图上模拟瘟疫扩散的Gif图

    2022-09-26 17:20:22
  • php foreach循环中使用引用的问题

    2023-11-17 17:22:26
  • Python实现连接dr校园网示例详解

    2022-09-20 05:00:45
  • 盲人站长深恶痛绝的onfocus=”this.blur()”

    2011-04-22 12:25:00
  • 一个完美网站的101项指标.第七部分.W3C标准

    2008-03-01 09:31:00
  • asp之家 网络编程 m.aspxhome.com