python 追踪except信息方式

 更新时间:2020年04月25日 10:28:45   作者:酷python  
这篇文章主要介绍了python 追踪except信息方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

看下面这个函数

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 Django框架中的嵌套序列化器详解

    python Django框架中的嵌套序列化器详解

    在Web开发领域,创建和使用API(应用程序编程接口)是很常见的,Django Rest Framework(DRF)是一个强大的工具包,在DRF中,一个关键概念是序列化器,在本文中,我们将深入研究Django中嵌套序列化器的概念以及它们如何促进复杂数据关系的处理,需要的朋友可以参考下
    2023-10-10
  • Python人脸检测实战之疲劳检测

    Python人脸检测实战之疲劳检测

    本文主要介绍了实现疲劳检测:如果眼睛已经闭上了一段时间,我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意。感兴趣的朋友可以了解一下
    2021-12-12
  • 让Django的BooleanField支持字符串形式的输入方式

    让Django的BooleanField支持字符串形式的输入方式

    这篇文章主要介绍了让Django的BooleanField支持字符串形式的输入方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python中复数的共轭复数知识点总结

    python中复数的共轭复数知识点总结

    在本篇内容里小编给大家整理的是关于python中复数的共轭复数知识点总结,有需要的朋友们可以学习下。
    2020-12-12
  • python按照行来读取txt文件全部内容(去除空行处理掉\t,\n后以列表方式返回)

    python按照行来读取txt文件全部内容(去除空行处理掉\t,\n后以列表方式返回)

    这篇文章主要介绍了python按照行来读取txt文件全部内容 ,去除空行,处理掉\t,\n后,以列表方式返回,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • python 通过邮件控制实现远程控制电脑操作

    python 通过邮件控制实现远程控制电脑操作

    这篇文章主要介绍了python 通过邮件控制电脑实现远程控制操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • python3判断IP地址的方法

    python3判断IP地址的方法

    这篇文章主要为大家详细介绍了python3判断IP地址的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Python基础之time库详解

    Python基础之time库详解

    这篇文章主要介绍了Python基础之time库详解,文中有非常详细的代码示例,对正在学习python基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • python字符串拼接和列表拼接方式

    python字符串拼接和列表拼接方式

    这篇文章主要介绍了python字符串拼接和列表拼接方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • python主动抛出异常raise的方法实现

    python主动抛出异常raise的方法实现

    本文主要介绍了python主动抛出异常raise的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12

最新评论