我试图理解python中的with语句,但我不明白它是如何处理异常的。
例如,我们有这样的代码file = open('file-path', 'w')
try:
file.write('Lorem ipsum')
finally:
file.close()
然后是这个代码
with open('file_path', 'w') as file:
file.write('hello world !')
这里何时调用file.close()
?从这个问题我认为,因为python有entry
和exit
函数(和退出函数是由自己调用时file.write();结束了吗?),但是我们要如何做异常处理(catch
)的声明,特别是?
另外,如果我们不写finally
在第一个代码段,它不会自己关闭连接吗?
file = open('file-path', 'w')
try:
file.write('Lorem ipsum')
当我们使用with
语句时,无论我们是由于异常而离开with
块,还是我们刚刚正常执行了包含的代码,__exit__
都会被调用。
如果包含在with块中的任何代码导致异常,它将导致__exit__
运行,然后将异常传播到周围的try/except块。
下面的代码片段(为了语法正确添加了finally: pass
):
file = open('file-path', 'w')
try:
file.write('Lorem ipsum')
finally:
pass
将永远不会导致文件被关闭,因此它将在程序的整个运行过程中保持打开状态(假设没有在其他任何地方调用close)。