处理和重新引发 Python 日志模块抛出的异常

1 投票
1 回答
2819 浏览
提问于 2025-04-18 12:22

问题

我该如何为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() 来获取当前的异常信息。

撰写回答