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 之外,必須傳入另外三個參數(shù),分別表示 exception 的類型,值(如 IndexError: list index out of range 中,冒號后面的部分就是值),以及 traceback。
返回 True 則表示這個異常被忽略。
返回 None, False 等則這個異常會拋出。
如果要忽略所有的異??梢赃@樣寫:
def __exit__(self, exc_type, exc_value, traceback):
return True
經(jīng)過測試, SyntaxError 是不能忽略的,其他已知的是可以的。