利用loguru打印变量值及错误堆栈信息
Python的loguru日志库提供强大的功能,可以便捷地打印变量值以及错误堆栈信息,这在调试过程中非常实用,而Python自带的traceback
模块则无法实现此功能。
loguru巧妙地利用了sys._getframe()
函数来访问当前函数的上下文信息,包括变量值。通过操作堆栈帧,它可以获取变量的值,并在打印错误堆栈的同时输出这些变量。
以下示例代码演示了如何在loguru中使用sys._getframe()
函数:
import sys
import loguru
log = loguru.logger
def get_trace_info():
print(sys._getframe().f_code.co_filename) # 当前文件名 (也可使用__file__)
print(sys._getframe(0).f_code.co_name) # 当前函数名
print(sys._getframe(1).f_code.co_name) # 调用函数的函数名 (若无调用则为)
print(sys._getframe(0).f_lineno) # 当前函数的行号
print(sys._getframe(1).f_lineno) # 调用函数的行号
try:
a = 1
b = 2
c = a / 0
except ZeroDivisionError as err:
log.exception(err) # 使用exception记录异常,包含堆栈信息和上下文
运行这段代码后,输出的错误信息将包含变量a
、b
和c
的值:
[2023-10-27 10:30:00] ERROR: division by zero
Traceback (most recent call last):
File "", line 13, in
File "", line 8, in get_trace_info
ZeroDivisionError: division by zero
During handling of the above exception, the following occurred:
... # 更多堆栈信息
...
in get_trace_info() at :8
a = 1
b = 2
c = a / 0
如上所示,loguru 通过sys._getframe()
函数成功打印了变量的值,即使这些变量是在异常发生时才被赋值的。 注意,我们使用了log.exception()
而不是log.error()
,因为exception
会自动包含完整的异常信息和堆栈跟踪。