如何记录python异常?

How to log python exception?

本问题已经有最佳答案,请猛点这里访问。

如何在python中记录异常?

我查看了一些选项,发现可以使用以下代码访问实际的异常详细信息:

1
2
3
4
5
6
7
8
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,以便记录它。


看一下logging.exception(python日志模块)

1
2
3
4
5
6
import logging
def foo():
    try:
        some_code()
    except:
        logging.exception('')

这将自动处理当前异常的跟踪并正确地记录它。


要回答您的问题,您可以使用traceback.format_exception()函数获得print_exception()的字符串版本。它以字符串列表的形式返回跟踪消息,而不是将其打印到stdout,这样您就可以使用它来做您想要的事情。例如:

1
2
3
4
5
6
7
8
9
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

这显示:

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

但是,我绝对推荐使用标准的python日志模块,正如rlotun所建议的那样。这不是最简单的设置,但它是非常可定制的。


日志异常与向任何日志消息添加exc_info=true关键字参数一样简单,请参见http://docs.python.org/2/library/logging.html中的logger.debug条目。

例子:

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

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

1
2
3
4
5
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


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

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

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

1
2
3
4
try:
    1/0
except Exception as e:
    print e

取决于您的python版本,您必须使用

1
except Exception, e