面试题答案
一键面试import logging
class LoggingContextManager:
def __init__(self, name):
self.name = name
def __enter__(self):
logging.info(f"Entering context {self.name}")
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type is None:
logging.info(f"Exiting context {self.name} normally")
else:
logging.error(f"Exiting context {self.name} due to exception: {exc_type.__name__}, {exc_value}")
return True # 处理异常,不向上传播
# 使用示例
with LoggingContextManager('example') as cm:
print('Inside the context')
raise ValueError('故意抛出的异常')
上述代码中,__exit__
方法接收三个参数:exc_type
(异常类型)、exc_value
(异常值)、traceback
(追溯信息)。如果exc_type
为None
,说明没有异常发生,正常退出;否则记录异常信息。通过返回True
,表明异常已被处理,不会向上传播。
- 初始化部分:
__init__
方法接收一个name
参数,用于标识上下文管理器。 - 进入上下文:
__enter__
方法记录进入上下文的日志,并返回自身实例。 - 退出上下文:
__exit__
方法根据exc_type
判断是否有异常发生,分别记录正常退出或异常退出的日志,并处理异常。