如何记录Python异常?

129 投票
5 回答
159679 浏览
提问于 2025-04-16 08:54

我该如何在Python中记录一个异常呢?

我查了一些方法,发现可以通过这段代码来获取实际的异常细节:

import sys
import traceback

try:
    1/0
except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    traceback.print_exception(exc_type, exc_value, exc_traceback)

我想要把print_exception()输出到标准输出(stdout)中的字符串获取到,这样我就可以记录它了。

5 个回答

64

要回答你的问题,你可以使用 traceback.format_exception() 这个函数来获取 print_exception() 的字符串版本。这个函数会把错误追踪信息以字符串列表的形式返回,而不是直接打印到屏幕上,这样你就可以随意处理这些信息了。例如:

import sys
import traceback

try:
    asdf
except NameError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
    print ''.join('!! ' + line for line in lines)  # Log it or whatever here

这样会显示:

!! Traceback (most recent call last):
!!   File "<stdin>", line 2, in <module>
!! NameError: name 'asdf' is not defined

不过,我还是强烈建议使用标准的 Python 日志模块,正如 rlotun 所提到的。虽然设置起来不是最简单的,但它非常灵活,可以根据你的需要进行调整。

162

看看 logging.exception 这个东西(可以参考Python日志模块

import logging 
def foo():
    try:
        some_code()
    except:
        logging.exception('')

这个功能会自动处理当前出现的错误信息,并把它记录下来,确保记录得很规范。

102

在Python 3.5中,你可以在exc_info参数中传递异常实例:

import logging
try:
    1/0
except Exception as e:
   logging.error('Error at %s', 'division', exc_info=e)

撰写回答