问题:
python中 with语句可以帮助 打开和关闭一些东西,比如用open的时候,那如果在在with语句之前加上了try 在 with语句中如果出现异常了,走到exception 后,with还会对程序进行关闭吗?
答案:
with是上下文管理器协议 实例如下:
try:
with open('xxx') as fin:
pass
except Exception:
pass
上下文管理器协议的本质就是【try-finally结构】:
try:
try:
fin = open('xxx')
pass
finally:
fin.close()
except Exception:
pass
再来要理解finally的本质:暂时压制try子句中抛出的异常,直到finally子句执行完毕后,再将其重新抛出。
上面代码中,如果内层try子句的pass部分出现了异常,会先被finally捕获并处理,然后才会进入外层的except子句。
那么这个内层try子句的pass部分是什么呢?就是with结构中的语句。所以with结构在任何情况下都能顺利完成清理工作。