如何在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以便我可以记录它。
答案 0 :(得分:103)
查看logging.exception
(Python 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