单子式错误处理(Monadic Error Handling)
概念定义:
单子是函数式编程的一个抽象概念,用于封装计算过程,:
- 包装一个值(Wrap)
- 链式处理这个值
- 保持计算的上下文
为什么需要它进行错误处理?
传统错误处理是以:返回值 + 错误码 或者异常处理
// 返回值 + 错误码
int divide(int a, int b, int* result) {
if (b == 0) return -1; // 错误码
*result = a / b;
return 0; // 成功
}
// 使用时需要手动检查
int result;
if (divide(10, 2, &result) != 0) {
// 处理错误
}
问题:
- 容易忘记检查错误码
- 错误处理代码与业务逻辑混杂
- 无法链式调用
单子式方案能够有效避免上述处理的缺点,且性能高:
Result<int> divide(int a, int b) {
if (b == 0) {
return Error("Division by zero");
}
return a / b;
}
// 链式调用,自动传播错误
auto result = divide(10, 2)
.and_then([](int x) { return divide(x, 0); }) // 这里出错
.and_then([](int x) { return divide(x, 2); }) // 自动跳过
.transform([](int x) { return x * 2; }); // 自动跳过
if (result) {
std::cout << "Success: " << *result << std::endl;
} else {
std::cout << "Error: " << result.error().what() << std::endl;
}
核心机制:短路求值
即:在逻辑运算或链式操作中,一旦确定最终结果,就立即停止后续计算。
类似如:
你去餐厅点餐:
1. 检查是否营业 ❌ → 不营业
└→ 直接离开(不会继续检查菜单、价格等)
2. 检查是否营业 ✅ → 营业中
└→ 检查是否有座位 ❌ → 没座位
└→ 直接离开(不会继续点菜)
3. 检查是否营业 ✅ → 营业中
└→ 检查是否有座位 ✅ → 有座位
└→ 检查菜单...
└→ 继续后续流程单子的三大定律
- 左单位律 :包装后立即解包 = 不包装
- 右单位律 :解包后立即包装 = 不操作
- 结合律 : 链式调用可重组
作者:admin 创建时间:2025-10-09 16:30
最后编辑:admin 更新时间:2025-10-09 16:56
最后编辑:admin 更新时间:2025-10-09 16:56