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

Rust中删除Redis键时如何正确打印mobc相关错误日志

问题原因

你遇到的编译错误是因为mobc_error::Error枚举类型本身没有内置as_result()方法,调用不存在的方法才触发了E0599错误。另外log库的日志宏本身就支持直接输出实现了Display/Debug trait的错误类型,不需要强行转JSON也能正常打印错误信息。


解决方案

方案1:直接输出错误日志(最简便)

如果只是需要在日志中打印错误用于排查问题,不需要把错误序列化为JSON存储,直接用Debug格式化符即可,修改你的match分支代码:

let del_result = del_redis_key(&del_key).await;
match del_result {
    Ok(_) => {
        info!("increment delete success...");
    }
    Err(failed) => {
        // 用{:?}输出完整错误栈,用{}只输出基础错误描述
        info!("increment delete failed..., {:?}", failed);
        // 错误场景建议用error级别日志更规范,可替换为以下写法
        // error!("increment delete failed..., {:?}", failed);
    }
};

该方案无需修改依赖和其他逻辑,修改后可直接编译运行。

方案2:需要序列化为JSON输出的场景

如果你确实需要把错误转成JSON字符串存储,首先要确认你自定义的错误类型(RedisCMDError、RedisTypeError)以及返回的Result对应的Error类型都实现了serde::Serialize trait,之后直接对错误本身序列化即可,不需要调用不存在的as_result()方法:

Err(failed) => {
    let failed_data = serde_json::to_string(&failed).unwrap();
    info!("increment delete failed...,{}", failed_data);
}

额外优化建议

你现有的del_redis_key代码中使用了两次unwrap()/expect()操作,遇到Redis连接异常时会直接导致程序panic,建议改成用?把错误向上抛出更稳妥:

pub async fn del_redis_key(key: &str,) -> Result<()> {
    let config_redis_string = getConfig("redisConnectionStr");
    let redis_client = redis::Client::open(config_redis_string.as_str())
        .map_err(|e| /* 此处转换为你定义的错误类型即可 */)?;
    let mut redis_conn = get_con(redis_client)
        .map_err(|e| /* 此处转换为你定义的错误类型即可 */)?;
    let del_result = redis_conn.del(key).map_err(RedisCMDError)?;
    FromRedisValue::from_redis_value(&del_result).map_err(|e| RedisTypeError(e).into())
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:45:03