如何使未捕获的异常通过 logging
模块而不是 stderr
输出?
我意识到最好的方法是:
try:
raise Exception, 'Throwing a boring exception'
except Exception, e:
logging.exception(e)
但我的情况是,如果 logging.exception(...)
在没有捕获到异常时自动调用,那将是非常好的。
最佳答案
这是一个完整的小示例,其中还包含一些其他技巧:
import sys
import logging
logger = logging.getLogger(__name__)
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
def handle_exception(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))
sys.excepthook = handle_exception
if __name__ == "__main__":
raise RuntimeError("Test unhandled")
忽略键盘中断,以便控制台 python 程序可以使用 Ctrl + C 退出。
完全依赖 python 的日志记录模块来格式化异常。
使用带有示例处理程序的自定义记录器。这个将未处理的异常更改为转到 stdout 而不是 stderr,但您可以将相同样式的各种处理程序添加到记录器对象。
https://stackoverflow.com/questions/6234405/