吉娅寿 发表于 昨天 10:15

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]
查看完整版本: Folly Expected 错误处理设计指南