MST

星途 面试题库

面试题:Python自定义上下文管理器中__enter__与__exit__方法的异常处理

在自定义一个上下文管理器类时,__exit__方法如何处理不同类型的异常?请编写代码实现一个上下文管理器,它能够在进入和退出时打印日志,并正确处理可能出现的异常。
13.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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_typeNone,说明没有异常发生,正常退出;否则记录异常信息。通过返回True,表明异常已被处理,不会向上传播。

  1. 初始化部分__init__方法接收一个name参数,用于标识上下文管理器。
  2. 进入上下文__enter__方法记录进入上下文的日志,并返回自身实例。
  3. 退出上下文__exit__方法根据exc_type判断是否有异常发生,分别记录正常退出或异常退出的日志,并处理异常。