python中的try、except、finally、with(enter和exit)

python中的with的使用——一个非常好用的特性

一、try、except、finally使用

def  exe_try():
    try:
        print("code started")
        raise KeyError #抛出异常
        return
    except KeyError as e:  #捕获异常
        print("key error")
        return 2
    else:
        print("other error")
        return 3
    finally: # 最后都会运行
        print("finally")
        return 4
    
if __name__ = "__main__":
    result = exe_try()
    print(result)
# code start
# key error
# finally
# 4

raisekey error,然后进入key error的异常处理,按道理应该输出2的,为什么最后return的是finally中的4?

因为如果finally语句有return语句,那最后一定会输出4,可以想成是一种栈的形式,确实进入key error后会返回2,但是2入栈后,finally语句又会返回4,所以优先输出栈顶元素4。

如果注释掉finally语句中的return,那结果就是2了。

二、with语句

with上下文管理器协议:__enter____exit__两个魔法函数

class Sampledef __enter__(self):
        print("enter")
        return self
    def __exit__(self,exc_type,exc_value,exc_tb):
        print("exit")
	def do_something(self):
        print("do somethong")

with Sample() as sample:
    sample.do_something()
  # enter  
  # doing something
  # exit

从运行结果可以看出,先调用__enter__,然后是do_something,最后离开with语句后会默认调用__exit__

有了这种上下文管理协议,我们就可以定义好一个类,然后用with语句来使用,并且可以在__enter__中获取资源,在__exit__中释放资源。

三、小节

定义上下文管理器更加简洁的方式请看这篇博客

猜你喜欢

转载自blog.csdn.net/weixin_43901214/article/details/106931596
今日推荐