搞清楚 Python traceback的具体使用方法

  • Post category:Python

当Python程序出现异常时,在控制台输出的错误信息中包含了一份称为 traceback 的调用堆栈信息。 traceback 信息记录了异常是如何在函数之间传递,以及导致错误的代码行号等详细信息。

以下是 Python traceback 的具体使用方法,分为两个方面讲解:1. 常用 traceback 模块的基本用法;2. traceback 模块的高级用法。

1. 常用 traceback 模块的基本用法

在 Python 程序中捕获到异常后,可以使用 traceback.print_exc()traceback.format_exc() 方法将 traceback 信息输出到控制台或字符串中:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

输出结果如下:

Traceback (most recent call last):
  File "<ipython-input-2-4869a105c44e>", line 3, in <module>
    1/0
ZeroDivisionError: division by zero

traceback.print_exc() 输出的 traceback 信息与在控制台中看到的一致,也可以将该信息输出到文件中:

import traceback

try:
    1/0
except Exception as err:
    with open('error.log', 'w') as f:
        traceback.print_exc(file=f)

上面的代码将 traceback 信息输出到文件 error.log 中。

Python 还提供了 traceback.format_exc() 方法,它的用法类似于 traceback.print_exc(),但它将 traceback 信息格式化成字符串形式:

import traceback

try:
    1/0
except Exception as err:
    tb_info = traceback.format_exc()
    print(tb_info)

输出结果如下:

Traceback (most recent call last):
  File "<ipython-input-2-4869a105c44e>", line 3, in <module>
    1/0
ZeroDivisionError: division by zero

由于 traceback.format_exc() 输出的是字符串格式的 traceback 信息,因此可以将其写入日志文件中,或者通过邮件、微信、短信等方式发送给开发人员。

2. traceback 模块的高级用法

通过 traceback.extract_tb() 方法可以获取 traceback 信息的各段信息,该方法返回一个 traceback 索引的列表,每一项包含四个元素:文件名、行号、函数名以及源代码:

import traceback

def test():
    a = 1 / 0

try:
    test()
except Exception:
    tb_list = traceback.extract_tb(sys.exc_info()[2])
    for tb in tb_list:
        filename, lineno, func, code = tb
        print(f"文件名: {filename}\n"
              f"行号: {lineno}\n"
              f"函数: {func}\n"
              f"代码: {code}")

上面的代码输出结果如下:

文件名: /Users/someone/Desktop/test.py
行号: 7
函数: test
代码: a = 1 / 0

另外,通过 traceback.walk_tb() 方法可以遍历 traceback 信息,该方法返回一个三元组,包含三个元素:一个帧对象、帧对象所对应的堆栈上下文以及堆栈上下文所处的层数:

import traceback

def test():
    a = 1 / 0

try:
    test()
except Exception:
    tb_obj = traceback.TracebackException(*sys.exc_info())
    for frame, filename, lineno, func, code, index in tb_obj.walk_tb():
        print(f"文件名: {filename}\n"
              f"行号: {lineno}\n"
              f"函数: {func}\n"
              f"代码: {code}")

上面的代码输出结果与上面的示例类似,但是通过 traceback.walk_tb() 方法可以获取到更多的堆栈上下文信息。

以上就是 Python traceback 的详细使用方法,希望对你有所帮助。