处理和重新引发 Python 日志模块抛出的异常
问题
我该如何为Python的logging
记录器写一个自定义处理器,以便捕捉到由于突然无法写入日志文件而导致的IOError
错误,并将这个错误重新抛出为另一种类型?
进一步信息
我正在读取和转换大量的原始数据,记录这个过程对我来说非常重要(使用Python的logging
模块)。如果因为某些错误,比如IOError
,日志记录失败,我希望应用程序能够优雅地退出。上周末,我写日志文件的网络位置崩溃了,而转换过程仍然在继续。
我的代码中可能会抛出IOError
,比如某个小时要转换的原始文件不存在,这表示在那段时间内检测器出现了问题,这些错误并不重要,可以忽略。我会捕捉这些错误,然后继续处理下一个小时的数据。
如果记录器抛出一个不同的自定义异常,我就可以单独处理它。就像这样(免责声明:这段代码不工作):
class WarningFileHandler(logging.FileHandler):
"""File handler for only writing WARNING log information to disk"""
def __init__(self,filename,mode='a',encoding=None,delay=False):
logging.FileHandler.__init__(self, filename, mode, encoding, delay)
def emit(self, record):
# Filter out all record objects that are not at the logging.WARNING level.
if not record.levelno == logging.WARNING:
return
try:
logging.FileHandler.emit(self, record)
except IOError as e:
# The logger cannot write successfully to disk (e.g. a network
# resource becomes unavailable).
raise LoggerIOError("[ERROR NO {0}: {1}]. Logger write "
"failure.".format(e.errno,e.strerror))
LoggerIOError
是一个简单的自定义异常。
class LoggerIOError(Exception):
"""Logger IOError"""
pass
有没有人能提供一些帮助或建议?我对logging
模块的经验不多,可能忽略了一些简单的东西。
logging.raiseExceptions
应该是默认值True
。
详细信息
操作系统/Python版本:
- Windows 7
- Python 2.7
谢谢!
1 个回答
3
异常是通过一个叫做 handleError
的方法来处理的,这个方法属于一个处理器,具体的说明可以在这里找到。如果你想要实现自定义的错误处理,可以创建一个相关处理器的子类。handleError
方法是在异常发生时被调用的,所以你可以用 sys.exc_info()
来获取当前的异常信息。