首页 > 文章列表 > 如何用loguru打印变量值及错误堆栈信息?

如何用loguru打印变量值及错误堆栈信息?

331 2025-04-07

如何用loguru打印变量值及错误堆栈信息?

利用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记录异常,包含堆栈信息和上下文

运行这段代码后,输出的错误信息将包含变量abc的值:

[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会自动包含完整的异常信息和堆栈跟踪。

来源:1740088657