首页 > 编程语言 >如何在Python中保留异常装饰器的堆栈跟踪

如何在Python中保留异常装饰器的堆栈跟踪

时间:2024-02-05 11:02:13浏览次数:34  
标签:bottom Python middle File 堆栈 line 异常 装饰

异常装饰器是一种通过装饰器(Decorator)机制来捕获和处理函数中异常的技术。当函数中发生异常时,装饰器可以捕获异常并进行处理,也可以记录异常信息或进行其他操作。堆栈跟踪(Stack Trace)是指在发生异常时,系统会输出一个包含异常信息和函数调用链的信息。对于经常使用python做爬虫来说,这些知识点还是要必须要会的。

如何在Python中保留异常装饰器的堆栈跟踪_python

1、问题背景

在 Python 中,我们经常会使用装饰器来对函数进行包装,以便在函数调用前后执行一些额外的操作。当函数在装饰器中抛出异常时,默认情况下,堆栈跟踪信息将指向装饰器函数,而不是实际引发异常的函数。这使得调试和定位问题变得困难。

2、解决方案

为了保留异常装饰器的堆栈跟踪信息,我们可以使用以下两种方法:

  1. 使用 raise 语句的三参数形式

在 Python 2.x 中,我们可以使用 raise 语句的三参数形式来指定异常类型、异常实例和堆栈跟踪信息。例如:

class MyError(Exception):
    pass

def try_except(fn):
    def wrapped(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except Exception as e:
            et, ei, tb = sys.exc_info()
            raise MyError, MyError(e), tb
    return wrapped

def bottom():
    1 / 0

@try_except
def middle():
    bottom()

def top():
    middle()

>>> top()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tmp.py", line 24, in top
    middle()
  File "tmp.py", line 10, in wrapped
    return fn(*args, **kwargs)
  File "tmp.py", line 21, in middle
    bottom()
  File "tmp.py", line 17, in bottom
    1 / 0
__main__.MyError: integer division or modulo by zero

在上面的例子中,try_except 装饰器会捕获函数 middle 中抛出的异常,并使用 raise 语句的三参数形式重新抛出异常。这样,堆栈跟踪信息就会指向函数 bottom,而不是函数 middle

  1. 使用 traceback 模块

在 Python 3 中,我们还可以使用 traceback 模块来获取和操作堆栈跟踪信息。例如:

import sys
import traceback

class MyError(Exception):
    pass

def try_except(fn):
    def wrapped(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except Exception as e:
            exc_type, exc_instance, exc_traceback = sys.exc_info()
            formatted_traceback = ''.join(traceback.format_tb(
                exc_traceback))
            message = '\n{0}\n{1}:\n{2}'.format(
                formatted_traceback,
                exc_type.__name__,
                exc_instance.message
            )
            raise MyError(message)
    return wrapped

def bottom():
    1 / 0

@try_except
def middle():
    bottom()

def top():
    middle()

>>> top()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tmp.py", line 24, in top
    middle()
  File "tmp.py", line 10, in wrapped
    return fn(*args, **kwargs)
  File "tmp.py", line 21, in middle
    bottom()
  File "tmp.py", line 17, in bottom
    1 / 0
__main__.MyError: 
Traceback (most recent call last):
  File "tmp.py", line 17, in bottom
    1 / 0

ZeroDivisionError: division by zero

在上面的例子中,try_except 装饰器会捕获函数 middle 中抛出的异常,并使用 traceback 模块获取堆栈跟踪信息。然后,装饰器会使用 raise 语句重新抛出异常,并将堆栈跟踪信息作为异常消息的一部分。这样,堆栈跟踪信息就会指向函数 bottom,而不是函数 middle

上面就是我对于堆栈跟踪的一些理解,如果有任何不懂的可以评论区留言讨论,在实际应用中,异常处理方式可能因需求而异。有时候,简单地打印堆栈跟踪可能是一个调试工具,而在生产环境中,你可能会希望记录异常信息并采取适当的措施,例如发送警报或者回滚事务。

标签:bottom,Python,middle,File,堆栈,line,异常,装饰
From: https://blog.51cto.com/u_13488918/9601673

相关文章

  • 理解日志基础:使用Python进行有效的日志记录
    源码分享https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tab=BB08J2日志记录是任何软件开发过程中的一个基本组成部分,尤其是在爬虫开发中。有效的日志记录策略可以帮助开发者监控爬虫的行为,诊断问题,以及追踪爬虫的性能。Python的logging模块提供了一套强大的日志记录工具,它可以帮助......
  • 【教程】Python代码混淆工具,Python源代码保密、加密、混淆
    引言Python作为一种高级脚本语言,便捷的语法和丰富的库使它成为众多开发者的首选。然而,有时候我们希望保护我们的Python源代码,避免被他人轻易获取和篡改。为了实现这一目标,我们可以采取代码混淆的技术手段。本文将介绍Python代码混淆的现状、优化方法和常用工具。正文1.使用pyc......
  • list assign in python
    ListAssignwithdifferentstrategiesinPythonHereisacodeblockdefrun_infer(self,g_blocks:List[TraceBlock],max_o_num:int=THREADS_NUM)->Iterable[B_PAIRS]:self.model.eval()_g_blocks=[*g_blocks]_default_inst=ArmInst(opcod......
  • python import
    pythonimportReferenceworld/│├──africa/│├──__init__.py│└──zimbabwe.py│├──europe/│├──__init__.py│├──greece.py│├──norway.py│└──spain.py│└──__init__.pyinthiscase,ifeverycountryf......
  • [转]gdb源码安装,指定使用的python版本
    转自:https://www.cnblogs.com/shengulong/p/8053370.html gdb调试python的时候,需要根据不同的python版本2.6、2.7、3.x安装相应的gdb;如何指定关联的python版本?下面gdb源码,解压后,进入目录:./configure-h并没有发现--with-python的选项。没有也没有问题,没有也可以自己加:whi......
  • 利用Python进行数据分析 pdf下载
    本书由Pythonpandas项目创始人WesMcKinney亲笔撰写,详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。第2版针对Python3.6进行全面修订和更新,涵盖新版的pandas、NumPy、IPython和Jupyter,并增加大量实际案例,可以帮助你高效解决一系列数据分析问题。......
  • Decorations in Python
    DecorationsinPythonReferences:ref1,ref2,ref3AdecoratorisadesignpatterninPythonthatallowsausertoaddnewfunctionalitytoanexistingobjectwithoutmodifyingitsstructure.FunctionsinPythonarefirst-classcitizens.Thismeansthatt......
  • 深度学习-DNN深度神经网络-反向传播02-python代码实现nn-41
    目录1.举例2.python实现1.举例2.python实现importnumpyasnpfromsklearn.datasetsimportfetch_mldatafromsklearn.utils.extmathimportsafe_sparse_dotdeftrain_y(y_true):y_ohe=np.zeros(10)y_ohe[int(y_true)]=1returny_ohemnist......
  • Python 机器学习 数据集分布可视化
    ​  Python的机器学习项目中,可视化是理解数据、模型和预测结果的重要工具。通过可视化可以观察数据集的分布情况,了解数据的特征和规律,可以评估模型的性能,发现模型的优缺点,分析预测结果,解释模型的预测过程。可视化数据集的分布和预测结果是整个过程中一个重要的步骤。通常可视......
  • 工作安排-od-python
    题目:小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化。输入描述:输入的第一行为两个正整数T,n。T代表工作时长(单......