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

函数执行失败时自动保存中间变量的Python装饰器是否存在?

解决方案:自定义异常捕获保存装饰器

你可以自己实现一个轻量的装饰器,完美匹配你的需求——在函数抛出异常时自动保存指定的中间变量,不用每次手动添加pickle代码。

实现装饰器

这个装饰器支持指定要保存的变量名和输出文件,捕获异常时自动保存局部变量并重新抛出异常,不影响原有错误流程:

import pickle
from functools import wraps
import inspect

def save_on_exception(save_vars, filename='intermediate_result.pickle'):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except Exception:
                # 获取函数执行时的局部变量
                frame = inspect.currentframe().f_back
                local_vars = frame.f_locals
                # 收集需要保存的目标变量
                saved_data = {var: local_vars[var] for var in save_vars if var in local_vars}
                # 写入文件
                with open(filename, 'wb') as f:
                    pickle.dump(saved_data, f)
                # 重新抛出异常,保留原错误信息
                raise
        return wrapper
    return decorator

用法示例

直接给目标函数加上装饰器,指定要保存的中间变量名即可:

# 假设two_hour_computation和post_processing是已定义的函数
@save_on_exception(save_vars=['result'])
def compute(input):
    result = two_hour_computation(input)
    result = post_processing(result)
    return result

当post_processing执行失败抛出异常时,装饰器会自动把result(也就是两小时计算的中间结果)保存到intermediate_result.pickle里,同时原异常会正常抛出,不影响你排查问题。

现成工具的替代思路

一些通用缓存库(比如joblib)主要用于缓存成功执行的结果,对于捕获异常时保存中间状态的场景,自定义装饰器反而更灵活,完全贴合你的业务流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:01:40