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) |
我想以某种方式将字符串
看一下
1 2 3 4 5 6 | import logging def foo(): try: some_code() except: logging.exception('') |
这将自动处理当前异常的跟踪并正确地记录它。
要回答您的问题,您可以使用
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 |