1.with语句使用场景
当异常发生时,往往需要做一些额外操作,如关闭数据库连接,关闭文件句柄等。一般使用try/catch/finally来完成这些操作,如:读文件时,可能出现两种异常,打开文件异常,读文件内容异常:try: file=open("fuwuqi.txt") data=file.read()except: passfinally: file.close()
with语句写法如下,它可以自动处理上下文环境产生的异常:
with open("fuwuqi.txt") as file: data=file.read()
2.with语句工作原理
with后面紧跟的对象obj,必须要有__enter__,__exit__两个方法with语句会首先调用obj对象的__enter__方法,并将返回值,传给as后面的变量with里面代码块执行完毕后,将调用obj对象的__exit__方法。使用示例:class Sample(): def __enter__(self): return "foo" def __exit(self,type,value,trace): print "exit"with Sample() as enter_result: print "enter_result:",enter_result
运行结果:
3.with语句处理异常
需要在对象obj中的__exit__方法定义处理异常class Sample(): def __enter__(self): return self def __exit__(self,type,value,trace): print "exit" print 'type',type print 'value',value print 'trace',trace def div(self,a,b): return a/b with Sample() as obj: obj.div(1,0)
运行结果:
class Sample(): def __enter__(self): return self def __exit__(self,type,value,trace): print "exit" print 'type',type print 'value',value print 'trace',trace def div(self,a,b): return a/b with Sample() as obj: obj.div(1,2)
4.with语句的作用
代码更简洁,异常处理工作可以由对象obj的__exit__方法来完成,如File对象的__exit__方法,已支持关闭文件句柄,使用with语句,无需捕获异常。