如何通过日志模块而不是stderr导致未捕获的异常输出?
我意识到最好的办法是:
try:
raise Exception, 'Throwing a boring exception'
except Exception, e:
logging.exception(e)
但我的情况是,如果在没有捕获异常时自动调用logging.exception(…),那就太好了。
如何通过日志模块而不是stderr导致未捕获的异常输出?
我意识到最好的办法是:
try:
raise Exception, 'Throwing a boring exception'
except Exception, e:
logging.exception(e)
但我的情况是,如果在没有捕获异常时自动调用logging.exception(…),那就太好了。
当前回答
方法sys。如果异常未被捕获,将调用Excepthook: http://docs.python.org/library/sys.html#sys.excepthook
当异常被引发并未被捕获时,解释器调用sys. js。Excepthook包含三个参数,异常类、异常实例和一个回溯对象。在交互式会话中,这发生在控制返回到提示符之前;在Python程序中,这发生在程序退出之前。这种顶级异常的处理可以通过给sys.excepthook分配另一个三个参数的函数来定制。
其他回答
正如奈德指出的,系统。Excepthook在每次引发并未捕获异常时调用。这样做的实际含义是,您可以在代码中重写sys的默认行为。Excepthook可以做任何你想做的事情(包括使用logging.exception)。
举个稻草人的例子:
import sys
def foo(exctype, value, tb):
print('My Error Information')
print('Type:', exctype)
print('Value:', value)
print('Traceback:', tb)
覆盖sys.excepthook:
>>> sys.excepthook = foo
提交明显的语法错误(省略冒号),并返回自定义错误信息:
>>> def bar(a, b)
My Error Information
Type: <type 'exceptions.SyntaxError'>
Value: invalid syntax (<stdin>, line 1)
Traceback: None
有关sys. exe的详细信息。但是,看看这些文件。
也许你可以在模块的顶部做一些事情,将stderr重定向到一个文件,然后在底部记录该文件
sock = open('error.log', 'w')
sys.stderr = sock
doSomething() #makes errors and they will log to error.log
logging.exception(open('error.log', 'r').read() )
在我的情况下(使用python 3),当使用@Jacinda的答案时,跟踪的内容没有打印。相反,它只打印对象本身:<traceback object at 0x7f90299b7b90>。
相反,我这样做:
import sys
import logging
import traceback
def custom_excepthook(exc_type, exc_value, exc_traceback):
# Do not print exception when user cancels the program
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
logging.error("An uncaught exception occurred:")
logging.error("Type: %s", exc_type)
logging.error("Value: %s", exc_value)
if exc_traceback:
format_exception = traceback.format_tb(exc_traceback)
for line in format_exception:
logging.error(repr(line))
sys.excepthook = custom_excepthook
以Jacinda的回答为基础,但使用记录器对象:
def catchException(logger, typ, value, traceback):
logger.critical("My Error Information")
logger.critical("Type: %s" % typ)
logger.critical("Value: %s" % value)
logger.critical("Traceback: %s" % traceback)
# Use a partially applied function
func = lambda typ, value, traceback: catchException(logger, typ, value, traceback)
sys.excepthook = func
方法sys。如果异常未被捕获,将调用Excepthook: http://docs.python.org/library/sys.html#sys.excepthook
当异常被引发并未被捕获时,解释器调用sys. js。Excepthook包含三个参数,异常类、异常实例和一个回溯对象。在交互式会话中,这发生在控制返回到提示符之前;在Python程序中,这发生在程序退出之前。这种顶级异常的处理可以通过给sys.excepthook分配另一个三个参数的函数来定制。