如何记录Python异常?
我该如何在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)