You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python上下文管理器__init__方法中的错误处理方案咨询

行星数据计算包的上下文管理器优化问题

背景与现有实现

我正在使用一个依赖文件存储信息来计算行星相关数据(如速度、位置)的包,该包仅提供load和unload方法,基础用法如下:

load(["File_1", "File_2"])
try:
    function()
finally:
    unload(["File_1", "File_2"])

这显然是上下文管理器的典型应用场景,但该包并未提供相关实现,因此我自行编写了一个上下文管理器类:

class file_manager:
    def __init__(self, file_list) -> None:
        self.file_list = file_list
        load(self.file_list)
        return None
    def __enter__(self) -> None:
        return None
    def __exit__(self, exc_type, exc_value, traceback) -> None:
        unload(self.file_list)
        return None

使用该上下文管理器后,代码可简化为:

with file_manager(["File_1", "File_2"]):
    function()

其中__exit__方法能保证即使function执行报错,文件仍会被正常卸载。

遇到的问题

load函数采用逐个加载文件的逻辑,且不会预先检查文件是否存在。如果File_1存在但File_2不存在,File_1会被成功加载,但加载File_2时会抛出异常。根据Python文档规则,仅当__enter__方法无错误返回时,__exit__才会被调用,因此此时已加载的File_1无法被卸载。

尝试方案与疑问

我尝试在__init__方法中用try...except处理异常:

def __init__(self, file_list) -> None:
    self.file_list = file_list
    try:
        load(self.file_list)
    except FileDoesNotExistError:
        self.__exit__(FileDoesNotExistError, False, None)

但不确定这是否是正确的解决方案,比如在Cython中类的__dealloc__方法可以保证无论是否发生异常都会执行,Python中有没有更稳妥的处理方式?

内容的提问来源于stack exchange,提问作者alfonsoSR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:55:17