如何捕获python异常并将回溯文本保存为字符串

fal*_*ets 7 python error-handling exception traceback

我正在尝试为我的代码编写一个很好的错误处理程序,以便当它失败时,日志、回溯和其他相关信息会通过电子邮件发送给我。

我不知道如何获取异常对象并提取回溯。

我发现该traceback模块非常混乱,主要是因为它根本不处理异常。它只是从某处获取一些全局变量,假设我想要最新的异常。但如果我不这样做呢?如果我想忽略错误处理程序中的某些异常怎么办?(例如,如果我无法向我发送电子邮件并想重试。)

我想要的是

import traceback as tb

# some function that will fail after a few recursions
def myfunc(x):
   assert x > 0, "oh no"
   return myfunc(x-1)

try:
    myfunc(3)
except Exception as e:
    traceback_str = tb.something(e)
Run Code Online (Sandbox Code Playgroud)

请注意,tb.something e作为参数

Stack Overflow 上有很多关于使用traceback模块获取回溯字符串的问题。这个问题的独特之处在于如何从捕获的异常而不是全局变量中获取它。

结果:

traceback_str 包含字符串:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in myfunc
  File "<stdin>", line 3, in myfunc
  File "<stdin>", line 3, in myfunc
  File "<stdin>", line 2, in myfunc
AssertionError: oh no
Run Code Online (Sandbox Code Playgroud)

请注意,它不仅包含最近的函数调用,还包含整个堆栈,并在末尾包含“AssertionError”

fal*_*ets 20

正确的函数tb.something(e)

''.join(tb.format_exception(None, e, e.__traceback__))
Run Code Online (Sandbox Code Playgroud)

  • [文档](https://docs.python.org/3/library/traceback.html#traceback.print_exception) 中的注释:从 Python 3.10 开始,可以将异常对象作为第一个传递,而不是传递 _value_ 和 _tb_争论。如果提供了 _value_ 和 _tb_,则忽略第一个参数以提供向后兼容性。 (2认同)