Python 想打印调用堆栈,traceback.format_exception和traceback.format_exc区别

432 阅读2分钟

traceback.format_exceptiontraceback.format_exc两者都用于获取异常的堆栈跟踪信息,但它们在使用方法和用途上有所区别:

  1. traceback.format_exception(etype, value, tb):

    • 这个函数接收三个参数:异常类型etype、异常值value以及一个traceback对象tb
    • 它返回一个堆栈跟踪信息的字符串列表,这些字符串可以被连接起来形成一个完整的堆栈跟踪信息。
    • 使用这个函数,你可以对异常的处理更加灵活,比如只打印堆栈的某些部分,或者在已经捕获异常并且拥有异常对象及其跟踪信息的情况下使用。
  2. traceback.format_exc():

    • 这个函数不需要任何参数,并且在当前异常上下文中自动提取“最近”异常的堆栈跟踪信息。
    • 它返回一个字符串,该字符串包含完整的堆栈跟踪信息。
    • 这个函数特别适合在except块中快速获取当前异常的堆栈跟踪信息,而不需要显式地访问异常对象或跟踪信息。

总结来说,traceback.format_exception提供了更多的灵活性,允许开发者在已知异常对象和其跟踪信息的情况下,精确控制如何格式化堆栈跟踪信息。而traceback.format_exc提供了一种快捷方式,用于快速获取并格式化“最近”异常的堆栈跟踪信息,特别是在异常处理代码块中。两者的选择取决于你的具体需求和场景。

def print_traceback_retry(fn):
    """
    装饰器,用于在函数重试前打印异常堆栈信息。
    """

    def wrapped_fn(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except Exception as e:
            tb_str = traceback.format_exception(etype=type(e), value=e, tb=e.__traceback__)
            logger.error("重试前的日志:异常堆栈信息:\n" + ''.join(tb_str))
            raise e  # 再次抛出异常以触发重试

    return wrapped_fn