详解sys.exc_info()(获取当前异常信息)函数的使用方法

  • Post category:Python

Python sys.exc_info()函数简介

sys.exc_info()是Python标准库中的一个函数,它的作用是在程序出现异常时获取许多异常相关的信息。这个函数可以返回当前正在处理的异常相关的三个值的元组:(type, value, traceback)

  • type:表示异常的异常类型,它是一个类对象。
  • value:表示异常的值,是异常的具体实例化对象。
  • traceback:表示异常的traceback对象,含有关于异常的栈信息。

这些值可以用于调试,或者在发生异常时打印异常的详细信息进而更好地理解代码运行时出现的异常。sys.exc_info()一般在异常处理中使用。

使用方法

sys.exc_info()函数调用时不需要传入任何参数,直接调用即可。它返回一个元组,包含当前处理中的异常的typevaluetraceback三个属性。

以下是一个使用sys.exc_info()获取异常信息的代码示例:

import sys

try:
    a = 1 / 0
except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print(f"type: {exc_type}")
    print(f"value: {exc_value}")
    print(f"traceback: {exc_traceback}")

输出结果为:

type: <class 'ZeroDivisionError'>
value: division by zero
traceback: <traceback object at 0x10dcf4370>

其中type为异常类型,value为异常的具体值,traceback为异常的traceback对象。

实例说明

实例一

该实例中演示了如何将异常信息写入日志文件。在代码中,我们通过sys.exc_info()获取当前处理的异常信息,并将其写入日志文件。

import logging
import sys

logging.basicConfig(filename='example.log', level=logging.DEBUG)

try:
    a = 1 / 0
except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    logging.error("Caught exception", exc_info=(exc_type, exc_value, exc_traceback))

通过使用exc_info参数,logging.error()可以自动提取异常信息,并将它们写入日志文件,便于查看程序中的异常信息。

实例二

该实例中模拟一个简单的递归函数,并在遇到异常时记录调用栈信息。

import sys

def recursive_print(n):
    if n == 0:
        raise ValueError("n must be positive")
    else:
        try:
            recursive_print(n-1)
        except:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            tb_list = []
            while exc_traceback:
                tb_list.append(exc_traceback)
                exc_traceback = exc_traceback.tb_next
            print(f"Exception {exc_type.__name__}: {exc_value}", file=sys.stderr)
            print(f"Call stack:", file=sys.stderr)
            for i, tb in enumerate(tb_list[::-1]):
                print(f"level {i} → {tb.tb_frame.f_code.co_filename}:{tb.tb_lineno} {tb.tb_frame.f_code.co_name}()", file=sys.stderr)

recursive_print(3)

输出结果:

Exception ValueError: 'n must be positive'
Call stack:
level 0 → /tmp/tmpk9cf82oh.py:7 recursive_print()
level 1 → /tmp/tmpk9cf82oh.py:7 recursive_print()
level 2 → /tmp/tmpk9cf82oh.py:7 recursive_print()

在遇到异常时,上述代码使用sys.exc_info()几乎完全地提取了异常调用栈信息,并将其显示在了标准错误输出中,方便进行排错。