【发布时间】:2011-11-14 21:04:28
【问题描述】:
这可能是一个开放式或尴尬的问题,但我发现自己遇到了越来越多的异常处理问题,我不知道处理它们的“最佳”方法。
如果您尝试使用不存在的文件配置 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 个 IOErrors。
这是正确的方法吗?有没有更好、更 Pythonic 的方式,我不知道或可能不理解?
【问题讨论】:
-
我很困惑不存在的文件是配置文件(传递给
fileConfig,如您的源代码)还是日志文件的名称(根据文本您的问题 - “尝试使用不存在的文件配置 FileHandler”)。我的答案是后者。通常,在指定文件(无论是配置文件还是日志文件)时,您需要确保很多事情 - 例如,文件可能已经存在但由于权限问题而无法读取或写入。没有万能的解决方案,这就是为什么您有时需要自己动手。 -
我指的是日志文件的名称,我需要从日志配置文件中获取它以检查它是否存在。在代码中此时必须获取该信息是不方便的。我同意您的观点,在启动时进行此检查将是理想的。也许我真正的问题是为什么日志模块不为用户处理这些类型的异常?
-
因为日志模块期望日志文件名是一个可写的文件,并且在一个存在的目录中。这种行为符合最小意外原则。典型的文本编辑器(例如,Windows 上的记事本或 Linux 上的 gedit)在使用不存在的目录中的文件名调用时,不会自动为您创建文件。记事本给出错误信息; gedit 不会以该名称保存文件,但会在您单击“保存”时提示您输入位置。
标签: python exception logging exception-handling ioerror