上下文管理协议总结

```python
with obj as  f:
    '代码块'
    
1.with obj ----》触发obj.__enter__(),拿到返回值

2.as f----->f=返回值、

3.with obj as f  等同于     f=obj.__enter__()

4.执行代码块
一:没有异常的情况下,整个with代码块运行完毕后去触发__exit__,它的三个参数都为None
二:有异常的情况下,从异常出现的位置直接触发__exit__
    a:如果__exit__的返回值为True,代表吞掉了异常
    b:如果__exit__的返回值不为True,代表吐出了异常
    c:__exit__的的运行完毕就代表了整个with语句的执行完毕。
若为a情况,with里面的语句,后面部分不会执行,执行with外面的语句
若为b情况,报出异常,后面的所有代码全部不会执行

好处:不用手动关闭这个存在内存中的obj,with代码执行完毕或遇到异常时,触发__exit__,二这里面可以自定义自动释放资源的机制,结束掉内存中的obj
比如文件处理,网络连接等等
```


当执行with 语句时,会先执行enter ,当代码执行完毕后执行exit,或者代码遇到了异常会立即执行exit,并传入错误信息包含错误的类型.错误的信息.错误的追踪信息
```
enter 函数应该返回对象自己
exit函数 可以有返回值,是一个bool类型,用于表示异常是否被处理,仅在上下文中出现异常有用
如果为True 则意味着,异常以及被处理了
False,异常未被处理,程序将中断报错
```

```python
class Foo:
def __init__(self,name):
self.name=name

def __enter__(self):
print('执行enter')
return self

def __exit__(self, exc_type, exc_val, exc_tb):
print('执行exit')
print(exc_type)
print(exc_val)
print(exc_tb)
return True
with Foo('a.txt') as f:
print(f)
print(asdfsaasdfasdfasdfasdfasfasdfasdfasdfasdfasfdasfd) #触发__exit__
print(f.name)
print('-----------------')
print('-----------------')
print('-----------------')
print('0000000000000000000000000000000000')
```
9ee458aaf083fe3b797851ea6ea783f1.png
exc_type就是异常类型 NameError
exc_val就是异常的值
exc_tb就是traceback追踪信息

posted @ 2019-08-14 15:08  坚持fighting  阅读(128)  评论(0编辑  收藏  举报