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

如何缓存HTTP错误响应?Ballerina缓存模块存储Error方案咨询

解决Ballerina缓存模块无法存储Error类型的方案

由于ballerina/cache模块不支持直接存储error类型,你可以通过以下几种方案实现错误响应的缓存:

方案一:用自定义记录包装响应数据与错误信息

定义包含成功数据和错误字段的记录,将原始响应转换为该记录后存入缓存,既能保存成功结果,也能完整记录错误细节。

步骤1:定义缓存用记录

// 定义用于缓存的响应记录,包含成功数据和错误信息
type CachedResponse record {
    SomeObject? data;       // 成功响应数据,可选类型
    string? errorMessage;   // 错误信息,可选类型
    int? errorCode;         // 错误码,可选类型
};

步骤2:修改缓存存储逻辑

将原始的SomeObject|error响应转换为CachedResponse后存入缓存:

isolated function cacheMyResponse(string id, SomeObject|error response) returns error? {
    CachedResponse cachedRes;
    
    if (response is SomeObject) {
        // 处理成功响应:填充data字段,错误字段设为null
        cachedRes = {data: response, errorMessage: (), errorCode: ()};
    } else {
        // 处理错误响应:提取错误信息和码(根据实际error结构调整)
        cachedRes = {
            data: (),
            errorMessage: response.message(),
            errorCode: <int>response.detail()?.code ?: 500
        };
    }
    
    var cachePutResult = myCache.put(id, cachedRes);
    if (cachePutResult is error) {
        log:printError("缓存响应失败", err = cachePutResult);
    }
    return cachePutResult;
}

步骤3:读取缓存并还原响应

从缓存获取记录后,转换回原始的SomeObject|error类型:

isolated function getCachedResponse(string id) returns SomeObject|error? {
    var cacheGetResult = myCache.get(id);
    
    if (cacheGetResult is CachedResponse) {
        if (cacheGetResult.data is SomeObject) {
            return cacheGetResult.data;
        } else {
            // 根据缓存的错误信息构造error返回
            return error(cacheGetResult.errorMessage ?: "未知错误", code = cacheGetResult.errorCode ?: 500);
        }
    } else if (cacheGetResult is error) {
        return cacheGetResult;
    }
    
    return (); // 缓存未命中
}

方案二:只缓存成功响应,错误响应标记状态

如果不需要缓存错误详情,仅需标记该请求曾返回错误,可以只缓存成功响应,同时用单独的缓存键记录错误状态:

isolated function cacheMyResponse(string id, SomeObject|error response) returns error? {
    if (response is SomeObject) {
        // 仅缓存成功响应
        var res = myCache.put(id, response);
        if (res is error) {
            log:printError("缓存成功响应失败", err = res);
        }
        // 清除可能存在的错误标记
        _ = myCache.delete(id + ":error");
        return res;
    } else {
        // 用单独的键标记该id对应错误
        var res = myCache.put(id + ":error", true);
        if (res is error) {
            log:printError("缓存错误标记失败", err = res);
        }
        // 清除可能存在的成功响应缓存
        _ = myCache.delete(id);
        return res;
    }
}

读取时先检查错误标记,再获取成功响应:

isolated function getCachedResponse(string id) returns SomeObject|error? {
    var errorFlag = myCache.get(id + ":error");
    if (errorFlag is boolean && errorFlag) {
        return error("请求曾返回错误");
    }
    
    var successRes = myCache.get(id);
    if (successRes is SomeObject) {
        return successRes;
    } else if (successRes is error) {
        return successRes;
    }
    
    return (); // 缓存未命中
}

方案三:将Error序列化为字符串存储

直接将error转换为字符串后存入缓存,读取时再解析为error(适合简单场景,可读性较差):

isolated function cacheMyResponse(string id, SomeObject|error response) returns error? {
    anydata cacheValue;
    if (response is SomeObject) {
        cacheValue = response;
    } else {
        // 将error转换为包含信息的字符串
        cacheValue = response.toString();
    }
    
    var res = myCache.put(id, cacheValue);
    if (res is error) {
        log:printError("缓存响应失败", err = res);
    }
    return res;
}

读取时判断类型并转换:

isolated function getCachedResponse(string id) returns SomeObject|error? {
    var cacheValue = myCache.get(id);
    if (cacheValue is SomeObject) {
        return cacheValue;
    } else if (cacheValue is string) {
        return error(cacheValue);
    } else if (cacheValue is error) {
        return cacheValue;
    }
    return ();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:27:17