zip_file_name = "not_exist.py"
try:
with zipfile.ZipFile(zip_file_name) as f_handle:
print("open it successfully")
except (zipfile.BadZipfile, zipfile.LargeZipFile), e:
print(e)
这是处理由with语句引发异常的正确方式吗?
zip_file_name = "not_exist.py"
try:
with zipfile.ZipFile(zip_file_name) as f_handle:
print("open it successfully")
except (zipfile.BadZipfile, zipfile.LargeZipFile), e:
print(e)
这是处理由with语句引发异常的正确方式吗?
是的,这就是你想要从with
语句内部处理异常的方式。上下文管理器(实现with
语句背后的行为)可以处理异常,但只应该这样做以正确清理对象使用的资源。
以下是相关文档中的片段:
如果BLOCK引发异常,则将调用上下文管理器的exit()方法,带有三个参数:异常详细信息(类型、值、回溯,与sys.exc_info()返回的相同值,如果没有发生异常,则也可以为None)。该方法的返回值控制是否重新引发异常:任何假值都会重新引发异常,True将导致抑制异常。您只会很少想要抑制异常,因为如果您这样做,包含“with”语句的代码的作者将永远不会意识到出了什么问题。
好的,没问题。
另一种选择是:
try:
f_handle = zipfile.ZipFile(zip_file_name)
# no more code here
except (zipfile.BadZipfile, zipfile.LargeZipFile), e:
print(e)
else:
with f_handle:
print("open it successfully")
这可以防止你在except
处理程序中意外捕获with
语句体内的异常。
__exit__
部分)。如果您要走这条路,我建议改用try/except/finally。 - Chris Phillips