Folly Expected 错误处理设计指南
Folly Expected 错误处理设计指南概述
Folly的Expected采用了一种强制性的错误处理设计,通过类型系统和运行时检查来确保程序员正确处理错误情况。这种设计将业务错误和程序逻辑错误明确区分,强制上层调用者遵循安全的访问模式。
底层设计机制
核心设计原理
template<class Value, class Error>
class Expected {
private:
// 强制性契约检查
void requireValue() const {
if (FOLLY_UNLIKELY(!hasValue())) {
if (FOLLY_LIKELY(hasError())) {
// 抛出包含原始错误信息的异常
throw_exception<BadExpectedAccess<Error>>(this->error_);
}
throw_exception<BadExpectedAccess<void>>();
}
}
public:
// 断言式访问 - 要求调用者确信有值
const Value& value() const& {
requireValue();// 契约验证点
return this->Base::value();
}
// 安全访问方法
bool hasValue() const noexcept;
bool hasError() const noexcept;
const Error& error() const&;
Value value_or(U&& defaultValue) const&;
};两层错误模型
[*]业务错误层:预期的、可处理的错误(网络超时、权限拒绝等)
[*]程序错误层:不应该发生的访问错误(忘记检查状态就调用value())
对上层调用的限制
强制性API契约
Expected通过以下机制强制上层代码遵循安全模式:
[*]类型约束:函数必须返回Expected,不能返回裸类型
[*]访问约束:调用value()前必须确保hasValue() == true
[*]运行时检查:违反契约立即抛出BadExpectedAccess异常
被强制的编程模式
// ✅ 允许的安全模式Expected result = fetchData();// 模式1:明确检查if (result.hasValue()) { process(result.value());// 安全访问} else { handle(result.error()); // 处理业务错误}// 模式2:提供默认值Data data = result.value_or(getDefaultData());// 模式3:函数式处理auto final = result .then([](Data d) { return transform(d); }) .orElse([](Error e) { return handleError(e); });// ❌ 被禁止的危险模式Data data = result.value();//
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]