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异常
被强制的编程模式
[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(); //
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |
|
|
|
相关推荐
|
|