从with语句内部捕获异常抛出

时间:2011-10-13 16:30:57

标签: python

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语句处理异常抛出的正确方法吗?

2 个答案:

答案 0 :(得分:5)

是的,这就是你想要处理with语句中的异常的方法。 ContextManagers(实现with语句后面的行为)可以处理异常,但只应这样做才能正确清理对象使用的资源。

以下是relevant documentation

的摘录
  

如果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语句的正文中捕获异常。