装饰器中丢失的回溯信息

时间:2019-01-06 05:47:17

标签: python decorator traceback

运行以下代码时,我无法从装饰器内部从sys.exc_info()提取的回溯信息中获取预期的行号。

import sys


def get_traceback(function):
    def wrapper(*args, **kwargs):
        try:
            function(*args, **kwargs) # line 7
        except:
            return sys.exc_info()[2]
    return wrapper


def inner():
    raise ValueError() # line 14 <--- the expected line number


@get_traceback
def outer():
    inner() # line 19


tb = outer()
print(tb.tb_lineno) # prints 7
print(tb.tb_next.tb_lineno) # prints 19

当在装饰器之外类似地调用sys.exc_info()时,我可以获取适当的行号。是什么原因造成的,我该怎么做以获得正确的行号?

谢谢!

2 个答案:

答案 0 :(得分:1)

Decorator只是向您的追溯添加了另一步。

这里是如何使用traceback内置库来获取它的方法:

import traceback

tb = outer()

traceback.extract_tb(tb)[-1].lineno

或以以前的样式,添加另一个 tb_next

print(tb.tb_next.tb_next.tb_lineno)

答案 1 :(得分:0)

你应该看看traceback shows up until decorator

我在我的装饰器中尝试过,它可以很好地打印整个内部和外部堆栈。