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语句处理异常抛出的正确方法吗?
答案 0 :(得分:5)
是的,这就是你想要处理with
语句中的异常的方法。 ContextManagers(实现with
语句后面的行为)可以处理异常,但只应这样做才能正确清理对象使用的资源。
如果BLOCK引发异常,则上下文管理器的退出()方法 用三个参数调用,异常细节(类型,值, traceback,sys.exc_info()返回的相同值,也可以 如果没有例外,则为无)。方法的返回值控制 是否重新引发异常:任何错误值都会重新引发异常 异常,而True将导致压制它。你很少 想要压制异常,因为如果你做了作者的话 包含'with'语句的代码永远不会实现任何进展 错。
答案 1 :(得分:3)
是的,没关系。
另一种选择是:
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")
这可以防止您意外地从with
处理程序中的except
语句的正文中捕获异常。