如何在调用栈中向上传递失败的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
相关产品推荐
相关产品推荐

