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

如何在调用栈中向上传递失败的std::expected?多校验场景处理

关于std::expected错误传递与多校验场景的实现疑问

基础使用场景

我有如下std::expected的使用场景:

class MyClass {
public:
    enum class error {
        e1 // ...
    };

    using index_return_type = std::expected<unsigned, error>;

    index_return_type add_data(data d);
    index_return_type update_data(data d);

private:
    std::expected<void, error> expand_to_fit(data) {
        // 假设此处执行失败
        return std::unexpected{error::e1};
    }
};

在add_data和update_data中,我总会先调用expand_to_fit,该函数可能执行失败。若失败,我希望直接将错误向上传递到外部。目前我的实现方式如下:

index_return_type add_data(data d) {
    if (auto it_fit = expand_to_fit(d); !it_fit) {
        return std::unexpected{it_fit.error()};
    }
    // 函数剩余逻辑
}

但我对这种实现并不满意,原因有两点:

  • it_fit的命名不够直观,若expand_to_fit因空间不足之外的原因失败,会导致代码可读性变差且具有误导性;
  • 这类错误检查代码需要在多个函数中重复编写,既繁琐又降低了代码可读性。

是否有更优的方式在调用栈中向上传递失败的std::expected?

扩展场景:多校验逻辑的处理

进一步扩展,假设我有一系列简短的校验逻辑。若使用异常处理,代码可能如下:

void expand_to_fit(data) {
    if (!connected_to_database()) {
       throw std::runtime_error("Lost connection");
    }
    
    if (has_data(data)) {
        throw std::runtime_error("Duplicate");
    }
    
    if (!is_input_in_max_range(data)) {
        throw std::runtime_error("Cannot fit");
    }
   
    // ... 函数剩余逻辑
}

那么使用std::expected该如何处理这类场景?


内容的提问来源于stack exchange,提问作者Fantastic Mr Fox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:08