MST

星途 面试题库

面试题:Python上下文管理器的异常处理与资源清理

在使用with语句和自定义上下文管理器时,如果在with块内发生异常,上下文管理器是如何处理异常并确保资源正确清理的?请通过代码示例详细说明。
28.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

在Python中,自定义上下文管理器需要实现 __enter____exit__ 方法。当在 with 块内发生异常时,__exit__ 方法会被调用,用于处理异常并确保资源的正确清理。

以下是一个简单的示例,展示了如何自定义上下文管理器并处理异常:

class FileContextManager:
    def __init__(self, file_name, mode):
        self.file_name = file_name
        self.mode = mode
        self.file = None

    def __enter__(self):
        self.file = open(self.file_name, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        if self.file:
            self.file.close()
        # 如果有异常,这里可以进行异常处理
        if exc_type:
            print(f"发生异常: {exc_type}, {exc_value}")
            # 返回True表示异常已处理,不向上传播;返回False则会让异常继续传播
            return True


# 使用自定义上下文管理器
with FileContextManager('test.txt', 'w') as file:
    file.write('Hello, World!')
    # 模拟异常
    raise ValueError("故意引发的异常")

在上述代码中:

  1. FileContextManager 类是自定义的上下文管理器。
  2. __init__ 方法初始化文件名称和打开模式,并初始化文件对象为 None
  3. __enter__ 方法打开文件并返回文件对象。
  4. __exit__ 方法负责关闭文件。如果有异常发生(exc_type 不为 None),它会打印异常信息,并返回 True 表示异常已处理,阻止异常继续向上传播。如果返回 False,异常会继续传播。

这样,无论 with 块内是否发生异常,文件都会被正确关闭,确保资源的正确清理。