class A:
def __enter__(self):
return '%s is good' % self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type == ZeroDivisionError:
print(exc_value)
print(traceback)
return True
elif exc_type == IndexError:
print(exc_value, type(exc_value))
print(traceback)
return True
with A():
a = []
a[0]
# 输出
list index out of range <class 'IndexError'>
<traceback object at 0x10b1e9548>
__enter__
__enter__ 用于赋值给 as 后面的变量。不过 with 语句中 as 不是必须的。__enter__ 和 __exit__ 必须并用。
__exit__
用于捕获异常,它的返回值是一个 boolean 对象。除了 self 之外,必须传入另外三个参数,分别表示 exception 的类型,值(如 IndexError: list index out of range 中,冒号后面的部分就是值),以及 traceback。
返回 True 则表示这个异常被忽略。
返回 None, False 等则这个异常会抛出。
如果要忽略所有的异常可以这样写:
def __exit__(self, exc_type, exc_value, traceback):
return True
经过测试, SyntaxError 是不能忽略的,其他已知的是可以的。
网友评论