面试题答案
一键面试在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("故意引发的异常")
在上述代码中:
FileContextManager
类是自定义的上下文管理器。__init__
方法初始化文件名称和打开模式,并初始化文件对象为None
。__enter__
方法打开文件并返回文件对象。__exit__
方法负责关闭文件。如果有异常发生(exc_type
不为None
),它会打印异常信息,并返回True
表示异常已处理,阻止异常继续向上传播。如果返回False
,异常会继续传播。
这样,无论 with
块内是否发生异常,文件都会被正确关闭,确保资源的正确清理。