正确处理logging.config.fileConfig抛出的IOError?

时间:2011-11-14 21:04:28

标签: python exception logging exception-handling ioerror

这可能是一个开放式或尴尬的问题,但我发现自己遇到越来越多的异常处理问题,我不知道处理它们的“最佳”方法。

如果您尝试使用不存在的文件配置FileHandler,Python的日志记录模块会引发IOError。该模块不处理此异常,只是提出它。通常情况下,文件的路径不存在(因此文件不存在),因此如果我们要处理异常并继续,我们必须沿路径创建目录。

我希望我的应用程序正确处理此错误,因为每个用户都询问我们为什么不为它们创建正确的目录。

我决定处理这个的方式可以在下面看到。

done = False
while not done:
    try:
        # Configure logging based on a config file
        # if a filehandler's full path to file does not exist, it raises an IOError
        logging.config.fileConfig(filename)

    except IOError as e:
        if e.args[0] == 2 and e.filename:
            # If we catch the IOError, we can see if it is a "does not exist" error
            # and try to recover by making the directories

            print "Most likely the full path to the file does not exist, so we can try and make it"
            fp = e.filename[:e.rfind("/")]

            # See http://stackoverflow.com/questions/273192/python-best-way-to-create-directory-if-it-doesnt-exist-for-file-write#273208 for why I don't just leap
            if not os.path.exists(fp):
                os.makedirs(fp)

        else:
            print "Most likely some other error...let's just reraise for now"
            raise
    else:
        done = True

我需要循环(或者我认为是递归),因为需要配置N个FileHandler,因此需要针对此场景引发和纠正N个IO错误。

这是正确的方法吗?是否有更好的,更多的Pythonic方式,我不知道或可能不明白?

2 个答案:

答案 0 :(得分:1)

这不是特定于日志记录模块的东西:通常,Python代码不会自动为您自动创建中间目录;您需要使用os.makedirs()显式执行此操作,通常如下所示:

if not os.path.exists(dirname):
    os.makedirs(dirname)

您可以使用子类替换标准FileHandler,该子类执行您需要的检查,并在必要时使用os.makedirs()创建日志文件的目录。然后,您可以在配置文件中指定此处理程序,而不是标准处理程序。

答案 1 :(得分:0)

假设它只需要在应用程序执行开始时执行一次,我只需os.makedirs()所有需要的目录,而不先检查它们是否存在,甚至等待日志记录模块引发错误。如果您在尝试启动记录器时遇到错误,您可以按照可能的方式处理它:打印错误,禁用记录器。你只是试图创建目录,超越了你。如果用户向您提供了虚假信息,那么您现在的情况并不比现在更糟糕,并且在绝大多数情况下您的情况会更好。