这可能是一个开放式或尴尬的问题,但我发现自己遇到越来越多的异常处理问题,我不知道处理它们的“最佳”方法。
如果您尝试使用不存在的文件配置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方式,我不知道或可能不明白?
答案 0 :(得分:1)
这不是特定于日志记录模块的东西:通常,Python代码不会自动为您自动创建中间目录;您需要使用os.makedirs()
显式执行此操作,通常如下所示:
if not os.path.exists(dirname):
os.makedirs(dirname)
您可以使用子类替换标准FileHandler
,该子类执行您需要的检查,并在必要时使用os.makedirs()
创建日志文件的目录。然后,您可以在配置文件中指定此处理程序,而不是标准处理程序。
答案 1 :(得分:0)
假设它只需要在应用程序执行开始时执行一次,我只需os.makedirs()
所有需要的目录,而不先检查它们是否存在,甚至等待日志记录模块引发错误。如果您在尝试启动记录器时遇到错误,您可以按照可能的方式处理它:打印错误,禁用记录器。你只是试图创建目录,超越了你。如果用户向您提供了虚假信息,那么您现在的情况并不比现在更糟糕,并且在绝大多数情况下您的情况会更好。