3

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

如果您尝试使用不存在的文件配置 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 个 FileHandlers,因此需要针对这种情况提出和纠正 N 个 IOErrors。

这是正确的方法吗?有没有更好、更 Pythonic 的方式,我不知道或可能不理解?

4

2 回答 2

1

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

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

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

于 2011-11-14T22:21:13.703 回答
0

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

于 2011-11-14T21:27:01.470 回答