0Pricing
C++ Academy · 课时

错误处理模式

组合 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 optional 表示缺失值
  2. 访问 optional 值
  3. std::expected 基础
  4. 错误处理模式
← 返回 C++ Academy