装饰器中丢失的回溯信息
Traceback Information Lost in Decorator
当运行以下代码时,我无法从装饰器内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()
进行类似的调用时,我能够获得适当的行号。这是什么原因,我该怎么做才能获得正确的行号?
提前致谢!
Decorator 只是在您的回溯中添加了另一个步骤。
以下是使用 traceback 内置库获取它的方法:
import traceback
tb = outer()
traceback.extract_tb(tb)[-1].lineno
或在以前的样式中,添加另一个 tb_next:
print(tb.tb_next.tb_next.tb_lineno)
你应该看看traceback shows up until decorator
我在我的装饰器中尝试了它,它可以很好地打印整个内部和外部堆栈。
当运行以下代码时,我无法从装饰器内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()
进行类似的调用时,我能够获得适当的行号。这是什么原因,我该怎么做才能获得正确的行号?
提前致谢!
Decorator 只是在您的回溯中添加了另一个步骤。
以下是使用 traceback 内置库获取它的方法:
import traceback
tb = outer()
traceback.extract_tb(tb)[-1].lineno
或在以前的样式中,添加另一个 tb_next:
print(tb.tb_next.tb_next.tb_lineno)
你应该看看traceback shows up until decorator
我在我的装饰器中尝试了它,它可以很好地打印整个内部和外部堆栈。