如何记录python异常?

时间:2010-12-22 11:46:38

标签: python exception-handling logging

如何在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 个答案:

答案 0 :(得分:103)

查看logging.exceptionPython Logging Module

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

这应该自动处理获取当前异常的回溯并正确记录它。

答案 1 :(得分:56)

要回答您的问题,您可以使用traceback.format_exception()功能获取print_exception()的字符串版本。它将traceback消息作为字符串列表返回,而不是将其打印到stdout,因此您可以使用它执行所需的操作。例如:

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所建议的那样。这不是最简单的设置,但它可以自定义。

答案 2 :(得分:50)

记录异常就像在任何日志消息中添加exc_info = True关键字参数一样简单,请参阅http://docs.python.org/2/library/logging.html中Logger.debug的条目。

示例:

try: 
    raise Exception('lala')
except Exception:
    logging.info('blah', exc_info=True)

输出(当然,取决于您的日志处理程序配置):

2012-11-29 10:18:12,778 - root - INFO - <ipython-input-27-5af852892344> : 3 - blah
Traceback (most recent call last):
  File "<ipython-input-27-5af852892344>", line 1, in <module>
    try: raise Exception('lala')
Exception: lala

答案 3 :(得分:9)

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

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

答案 4 :(得分:5)

首先,考虑在except子句中使用正确的Exception类型。 然后,命名异常,您可以打印它:

try:
    1/0
except Exception as e:
    print e

依赖于您的Python版本,您必须使用

except Exception, e