错误处理模式
组合 optional 和 expected
错误处理模式 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
两种工具,一个目标
std::optional 和 std::expected 都能取代容易出错的哨兵值。本课将介绍如何清晰地组合和串联使用它们。
为空时提前返回
一种简单易读的模式:检查 optional,如果它为空,就立即退出,然后再继续执行。
#include <iostream>
#include <optional>
std::optional<int> parse(bool ok) { return ok ? std::optional<int>(5) : std::nullopt; }
int main() {
auto v = parse(true);
if (!v) { std::cout << "no value\n"; return 0; }
std::cout << *v + 1 << "\n";
}从 Optional 转换为 Expected
当调用方需要知道原因时,将缺失的 optional 转换为带有明确说明的错误。
#include <expected>
#include <optional>
#include <string>
std::expected<int, std::string> require(std::optional<int> o) {
if (o) return *o;
return std::unexpected("value missing");
}
int main() {}使用 value_or 串联
当多个查找操作共同产生一个结果时,value_or 允许您直接提供默认值,而无需嵌套的 if 语句。
#include <iostream>
#include <optional>
int setting(std::optional<int> user, int fallback) {
return user.value_or(fallback);
}
int main() {
std::cout << setting(std::nullopt, 42) << "\n";
}向上层传递错误
使用 std::expected 时,函数可以检查子调用的结果,并原样转发其中的错误,从而构建错误传递流程。
#include <expected>
#include <string>
using R = std::expected<int, std::string>;
R step1(bool ok) { return ok ? R(2) : R(std::unexpected("step1 failed")); }
R run(bool ok) {
auto r = step1(ok);
if (!r) return std::unexpected(r.error());
return *r * 10;
}
int main() {}单子式 and_then
C++23 的 and_then 可以串联每个都返回 optional 或 expected 的操作;一旦出现第一次失败就会短路,无需手动编写层层嵌套的 if。
使用 transform 进行映射
transform 会将普通函数应用于成功值,并保持错误或空状态不变,只处理成功路径。
使用 or_else 进行恢复
or_else 会运行一个后备操作;当原始结果为空或失败时,该操作可以提供替代值或其他错误。
在两者之间做选择
当缺失不需要解释时(例如缓存未命中),请使用 optional。当调用方必须区分失败原因时(例如解析错误和权限错误),请使用 expected。
避免混用哨兵值
不要在同一个 API 中混用旧式错误代码与 optional/expected。请选择一种一致的策略,使调用方能够统一处理失败。
让错误保持类型化
当程序需要以编程方式检查失败时,优先使用枚举或小型结构体作为错误类型,而不是直接使用字符串;字符串更适合面向用户的消息。
快速检查
检查您对错误处理模式的理解。
回顾
您学习了错误处理模式:
- 在为空或出错时提前返回,可以让代码保持扁平。
- 需要说明原因时,将 optional 转换为 expected。
- 使用
and_then、transform和or_else进行组合(C++23)。 - 保持一致,避免将哨兵值与 optional/expected 混用。
常见问题解答
「错误处理模式」课时是免费的吗?
是的 — 「错误处理模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「错误处理模式」这节课中我会学到什么?
组合 optional 和 expected 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「错误处理模式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。