[英]python 2.x:Conditionally Catching Exceptions (Ignore gracefully cleanup if the file is missing)
我有一个脚本可以在共享位置清理超过14天的日志。 现在,该脚本可以在不同主机上同时运行。 在特定情况下,如果两个或更多主机尝试清除同一文件,则只有一个主机将成功,而其他所有主机都将给出错误“无此文件或目录”。 如果文件突然丢失,如何更新代码以忽略正常清理。 以下是执行清理的部分代码。 count
跟踪删除的文件数。
if os.stat(filename).st_mtime < current_time - 14 * 86400:
try:
os.remove(filename)
count += 1
except:
logger.warning("Not able to delete the file %s" % filename)
一种方法是在文件不存在的情况下“传递”异常,但在无法删除文件的情况下继续记录警告。 如何包括此条件。
正如@Mark建议的那样,您可以事先检查文件是否存在,然后将其删除,但是这种方法仍然存在潜在的竞争状况。 它可以在os.stat
之后和os.remove
之前的脚本实例之间发生。 将所有引发错误的代码移至try
/ except
,即可完成这项工作。 但是,据我了解,记录真实消息存在问题。 附加标志attempted_delete
应该可以帮助您:
attempted_delete = False
try:
if os.stat(filename).st_mtime < current_time - 14 * 86400:
os.remove(filename)
count += 1
attempted_delete = True
except:
if attempted_delete:
logger.warning("Not able to delete the file %s" % filename)
一个没有异常(类型)列表的except
子句是一个万能的:易于设置但很难使用。 在这里,您应该专门捕获(并忽略) FileNotFoundError
并记录任何其他异常:
try:
if os.stat(filename).st_mtime < current_time - 14 * 86400:
os.remove(filename)
count += 1
except FileNotFoundError:
pass # file has already been deleted: all is fine
except:
logger.warning("Not able to delete the file %s" % filename)
上面是针对Python 3的,当您使用Python 2时,您只能检查OSError然后控制其errno属性:
try:
if os.stat(filename).st_mtime < current_time - 14 * 86400:
os.remove(filename)
count += 1
except OSError as e:
if e.errno != errno.ENOENT:
# do not log if file has already been deleted
logger.warning("Not able to delete the file %s" % filename)
except:
logger.warning("Not able to delete the file %s" % filename)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.