面试题答案
一键面试在上下文管理器的 __exit__
方法中,可以通过对异常类型进行判断,来决定是捕获并处理异常还是继续向上抛出。__exit__
方法接收三个参数:exc_type
(异常类型)、exc_value
(异常值)和 exc_traceback
(异常的追溯信息)。如果 __exit__
方法返回 True
,则表示异常已被处理,不会再向上抛出;如果返回 False
或者没有返回值,则异常会继续向上抛出。
以下是一个示例:
class MyContextManager:
def __enter__(self):
print("进入上下文")
return self
def __exit__(self, exc_type, exc_value, exc_traceback):
if exc_type is ValueError:
print(f"捕获到 ValueError 异常: {exc_value}")
# 处理异常,返回 True 表示异常已处理
return True
else:
print(f"其他类型异常: {exc_type}")
# 不返回值,异常会继续向上抛出
return
with MyContextManager() as cm:
raise ValueError("这是一个故意抛出的 ValueError 异常")
with MyContextManager() as cm:
raise TypeError("这是一个故意抛出的 TypeError 异常")
在上述示例中:
- 当在上下文代码块中抛出
ValueError
异常时,__exit__
方法捕获到该异常并进行处理,然后返回True
,异常不会再向上抛出。 - 当抛出其他类型(如
TypeError
)的异常时,__exit__
方法不返回True
,异常会继续向上抛出。