在Python开发中,我们经常需要用logger将日志写入到文件。我们通常也需要将控制台中见到的所有异常信息都写入到文件中,比如一个经典的异常如下:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
但是默认情况下,除非我们在try-except的except中调用logger手动记录,否则我们会惊讶地发现,异常信息Traceback
只在控制台打印了,而日志文件中却没有。
这种情况下我们就需要用到sys.excepthook:每次有新的且未被捕获的exception的时候,sys.excepthook就会被调用。python允许我们重写这个方法,来实现我们自己对异常的处理。
代码如下:
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")
转自:https://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python/16993115#16993115
(部分文字引用自:http://www.zhangdongshengtech.com/article-detials/282)
我不是程序员,我只是stackoverflow的搬运机~
网友评论