找回密码
 立即注册
首页 业界区 安全 Folly Expected 错误处理设计指南

Folly Expected 错误处理设计指南

忌才砟 6 小时前
Folly Expected 错误处理设计指南

概述

Folly的Expected采用了一种强制性的错误处理设计,通过类型系统和运行时检查来确保程序员正确处理错误情况。这种设计将业务错误程序逻辑错误明确区分,强制上层调用者遵循安全的访问模式。
底层设计机制

核心设计原理
  1. template<class Value, class Error>
  2. class Expected {
  3. private:
  4.     // 强制性契约检查
  5.     void requireValue() const {
  6.         if (FOLLY_UNLIKELY(!hasValue())) {
  7.             if (FOLLY_LIKELY(hasError())) {
  8.                 // 抛出包含原始错误信息的异常
  9.                 throw_exception<BadExpectedAccess<Error>>(this->error_);
  10.             }
  11.             throw_exception<BadExpectedAccess<void>>();
  12.         }
  13.     }
  14. public:
  15.     // 断言式访问 - 要求调用者确信有值
  16.     const Value& value() const& {
  17.         requireValue();  // 契约验证点
  18.         return this->Base::value();
  19.     }
  20.    
  21.     // 安全访问方法
  22.     bool hasValue() const noexcept;
  23.     bool hasError() const noexcept;
  24.     const Error& error() const&;
  25.     Value value_or(U&& defaultValue) const&;
  26. };
复制代码
两层错误模型


  • 业务错误层:预期的、可处理的错误(网络超时、权限拒绝等)
  • 程序错误层:不应该发生的访问错误(忘记检查状态就调用value())
对上层调用的限制

强制性API契约

Expected通过以下机制强制上层代码遵循安全模式:

  • 类型约束:函数必须返回Expected,不能返回裸类型
  • 访问约束:调用value()前必须确保hasValue() == true
  • 运行时检查:违反契约立即抛出BadExpectedAccess异常
被强制的编程模式

[code]// ✅ 允许的安全模式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();  //
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册