【发布时间】:2011-12-24 10:42:40
【问题描述】:
我想检查特定后台文件中的错误,但标准错误流由前台程序控制,并且问题中的文件中的错误未显示。不过,我可以使用logging 模块并将输出写入文件。我想知道如何使用它来记录所有异常、错误及其回溯。
【问题讨论】:
我想检查特定后台文件中的错误,但标准错误流由前台程序控制,并且问题中的文件中的错误未显示。不过,我可以使用logging 模块并将输出写入文件。我想知道如何使用它来记录所有异常、错误及其回溯。
【问题讨论】:
记录程序中抛出的任何异常可能是个坏主意,因为 Python 也将异常用于正常的控制流。
因此,您应该只记录 未捕获 异常。一旦有了异常对象,您就可以使用记录器的exception() method 轻松完成此操作。
要处理所有未捕获的异常,您可以将脚本的入口点包装在 try...except 块中,或者通过重新分配 sys.excepthook() 来安装自定义异常处理程序:
import logging
import sys
logger = logging.getLogger('mylogger')
# Configure logger to write to a file...
def my_handler(type, value, tb):
logger.exception("Uncaught exception: {0}".format(str(value)))
# Install exception handler
sys.excepthook = my_handler
# Run your main script here:
if __name__ == '__main__':
main()
【讨论】:
sys.__excepthook__(type, value, tb) 附加到您的my_handler 不是一个好主意,这样它就可以处理异常时的默认操作?
logger.exception("Uncaught exception: {0}: {1}".format(str(value.__class__.__name__), str(value))) 在我的情况下给出ERROR - Uncaught exception: IndexError: list index out of range 并出于某种原因打印None。我如何获得完整的回溯? tb 似乎是一个回溯对象,但 traceback.print_tb(tb) 也只是吐出 None。
exc_info kwarg 来记录回溯。它似乎只适用于logger.error 或logger.critical,但不适用于logger.exception。
main() 替换为 hello ==== "Hello" 仍会导致将堆栈跟踪打印到控制台。
import sys
import logging
import traceback
# log uncaught exceptions
def log_exceptions(type, value, tb):
for line in traceback.TracebackException(type, value, tb).format(chain=True):
logging.exception(line)
logging.exception(value)
sys.__excepthook__(type, value, tb) # calls default excepthook
sys.excepthook = log_exceptions
【讨论】: