0Pricing
C++ Academy · 课时

自定义异常类型

定义您自己的异常

自定义异常类型 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

为什么需要自定义异常

定义自己的异常类型,可以让调用方专门捕获您的错误,并在错误中携带特定领域的数据。

派生自 std::exception

请以 std::exception(或其子类)为异常的基类,这样它们就能与标准处理程序集成,并提供 what()。

#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

抛出和捕获自定义异常

您的类型的行为与其他异常相同:按值抛出,按引用捕获。

#include <iostream>
#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

int main() {
    try {
        throw ConfigError("missing key");
    } catch (const ConfigError& e) {
        std::cout << e.what() << "\n";
    }
}

复用标准基类

很多时候,您可以从 std::runtime_error 或 std::logic_error 派生;它们已经存储了消息,可以减少样板代码。

#include <stdexcept>
#include <string>

class NetworkError : public std::runtime_error {
public:
    explicit NetworkError(const std::string& m) : std::runtime_error(m) {}
};

携带额外数据

自定义异常可以保存错误代码或出错值等字段,为处理程序提供更多上下文。

#include <stdexcept>
#include <string>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m)
        : std::runtime_error(m), status(s) {}
};

按基类捕获

由于您的类型派生自 std::exception,通用处理程序仍可以通过基类引用捕获它。

#include <iostream>
#include <stdexcept>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m) : std::runtime_error(m), status(s) {}
};

int main() {
    try {
        throw HttpError(404, "not found");
    } catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

构建异常层次结构

请将相关错误归入一个共同的基类之下,这样调用方既可以捕获整个异常族,也可以捕获某个具体类型。

#include <stdexcept>

struct AppError : std::runtime_error { using std::runtime_error::runtime_error; };
struct DbError  : AppError       { using AppError::AppError; };
struct AuthError: AppError       { using AppError::AppError; };

让 what() 保持 noexcept

请将 what() 重写为 const noexcept,并返回一个稳定的缓冲区——它绝不能抛出异常,也不能返回悬空指针。

按值抛出

请按值抛出异常对象(例如 throw HttpError(500, "x");)。运行时会在栈展开期间管理它们的存储。

记录会抛出哪些异常

请将接口的异常类型作为其契约的一部分,让调用方知道应编写哪些捕获处理。

保持简单

大多数项目只需要少量异常类型。从 std::runtime_error 派生可以简洁地覆盖大多数情况。

快速检查

请测试您对自定义异常的理解。

回顾

您已经学习了如何通过从 std::exception 或 std::runtime_error 派生来定义自定义异常类型,携带额外数据,构建层次结构,让 what() 保持 noexcept,并按值抛出异常。请保持异常类型集合精简并做好文档记录。

常见问题解答

「自定义异常类型」课时是免费的吗?

是的 — 「自定义异常类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「自定义异常类型」这节课中我会学到什么?

定义您自己的异常 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「自定义异常类型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. try、catch、throw
  2. 异常安全
  3. noexcept 说明符
  4. 自定义异常类型
← 返回 C++ Academy