C++如何自定义异常类_C++继承exception类实现异常处理【扩展】-C++

继承 std::exception 是为了接入标准异常体系,支持统一捕获、多态和扩展;必须重写 what() 并加 noexcept,返回长期有效的 const char*;额外信息通过成员变量和访问器携带。

为什么继承 std::exception 而不是直接用字符串 throw?

直接 throw "error" 或 throw 42 虽然语法合法,但无法统一捕获类型、丢失上下文、且不能携带额外信息(如错误码、文件名、行号)。继承 std::exception 是为了接入标准异常体系:能被 catch (const std::exception& e) 捕获,支持多态,也方便后续扩展字段和重载 what()。

自定义异常类必须重写 what() 吗?

是的。基类 std::exception::what() 返回的是空字符串或未定义行为;不重写会导致 e.what() 输出不可靠内容(常见为 "std::exception" 或崩溃)。实际中要确保返回指向**长期有效内存**的 const char*:

  • 不能返回局部数组(如 char buf[256]; return buf;)
  • 不能返回临时 std::string 的 c_str()(如 return std::string("xxx").c_str();)
  • 推荐用 mutable std::string m_what_cache 缓存,每次调用 what() 时更新并返回其 c_str()

示例关键片段:

class FileOpenError : public std::exception {
    std::string m_msg;
public:
    FileOpenError(const std::string& file) 
        : m_msg("Failed to open file: " + file) {}
    const char* what() const noexcept override {
        return m_msg.c_str();
    }
};

要不要加 noexcept 修饰 what()?

要。C++11 起,std::exception::what() 声明为 noexcept,子类重写时若不加,会隐式变成可能抛异常,导致编译警告甚至 ABI 不兼容(尤其在动态链接场景)。所有重写的 what() 必须带 noexcept。

立即学习“C++免费学习笔记(深入)”;

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何自定义异常类_C++继承exception类实现异常处理【扩展】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008899+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008899+
  • 本周更新: 0+
  • 最后更新: 2026-03-16