全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++怎么实现自定义异常类_c++ 继承std::exception与what方法重写【实战】

继承 std::exception 时必须用类内 std::string 成员保存错误消息并重写 const noexcept 的 what() 方法,否则 what() 返回悬垂指针导致未定义行为;还需显式声明 virtual 析构函数,并以 const& 方式捕获异常。

为什么继承 std::exception 不能只写空构造函数

直接继承 std::exception 并只定义一个空构造函数,会导致 what() 返回的字符串不可控甚至崩溃。因为 std::exception 的默认实现不保存任何消息,其 what() 返回的是未定义行为(常见为指向已销毁栈内存的指针),尤其在抛出后被多次调用时极易出错。

  • 必须确保 what() 返回的 C 字符串生命周期长于异常对象本身存活期
  • 不能返回局部 std::string::c_str() 或临时 std::string 的内部指针
  • 推荐在类内持有一个 std::string 成员,用它来提供稳定地址

如何安全重写 what() 方法(含 const 和 noexcept)

what() 必须声明为 const noexcept,否则无法通过 std::exception 接口被正确调用;同时返回类型必须是 const char*,且指向的内容不能随对象析构而失效。

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

};

  • message_ 是类内 std::string 成员,保证字符串存储在堆上、生命周期与异常对象一致
  • noexcept 是强制要求:C++ 标准规定 std::exception::what()noexcept,子类重写也必须保持相同异常规范
  • 不要在 what() 里拼接新字符串或调用可能抛异常的函数

要不要加 virtual 析构函数?

要。虽然 std::exception 的析构函数已是 virtual,但显式写出能避免误删派生类资源(比如你后续在自定义异常中添加了动态分配的缓冲区或文件句柄)。

  • 即使当前没资源要清理,也建议统一加上 virtual ~FileOpenError() = default;
  • 不加不会立即报错,但若未来扩展异常类携带资源,就容易发生析构不完整、内存泄漏等问题
  • 所有多态基类都应该有 virtual 析构函数——这是 C++ 基本守则,不是可选项

实际使用时容易忽略的细节

捕获时别用值传递,也别漏掉 const&;日志打印前先确认 what() 是否真的可用;跨 DLL 边界抛异常需格外小心。

  • 错误写法:catch (FileOpenError e) —— 触发不必要的拷贝,还可能切片(如果从更深层派生)
  • 正确写法:catch (const FileOpenError& e)catch (const std::exception& e)
  • catch 块里直接用 e.what() 是安全的,但不要把它存成裸指针长期持有
  • Windows 下若异常跨越 DLL 边界(如 DLL 抛出、EXE 捕获),std::exception 及其派生类可能因 ABI 不兼容而崩溃;此时应改用错误码或跨 ABI 的结构体传信息

标准库异常体系不鼓励深度继承,但只要守住 what() 的生命周期、noexcept 约束和虚析构这三点,自定义异常就能稳住。最常翻车的地方,其实是把 what() 写成返回临时字符串的指针——这个坑,几乎每个初学者都踩过一次。


# windows  #   # ai  # c++  # win  # 一加  # 标准库  # 为什么  # String  # 多态  # 子类  # 构造函数  # 析构函数  # catch  # const  # 字符串  # 结构体  # char  # 指针  # 继承  # 接口  #   # 值传递  # 切片  # 对象  # default  # 重写  # 自定义  # 抛出  # 的是  # 这是  # 派生类  # 就能  # 句柄  # 把它 


相关文章: 如何快速选择适合个人网站的云服务器配置?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  如何高效生成建站之星成品网站源码?  如何解决VPS建站LNMP环境配置常见问题?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  海南网站制作公司有哪些,海口网是哪家的?  名字制作网站免费,所有小说网站的名字?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  如何在Golang中指定模块版本_使用go.mod控制版本号  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何做静态网页,sublimetext3.0制作静态网页?  如何在IIS7上新建站点并设置安全权限?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  ,有什么在线背英语单词效率比较高的网站?  如何在Tomcat中配置并部署网站项目?  如何在七牛云存储上搭建网站并设置自定义域名?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  做企业网站制作流程,企业网站制作基本流程有哪些?  建站之星导航配置指南:自助建站与SEO优化全解析  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  建站主机选哪家性价比最高?  高端云建站费用究竟需要多少预算?  专业网站建设制作报价,网页设计制作要考什么证?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何在IIS管理器中快速创建并配置网站?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  高端建站三要素:定制模板、企业官网与响应式设计优化  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  制作网站的公司有哪些,做一个公司网站要多少钱?  如何用VPS主机快速搭建个人网站?  常州企业网站制作公司,全国继续教育网怎么登录?  成都网站制作报价公司,成都工业用气开户费用?  如何用搬瓦工VPS快速搭建个人网站?  制作销售网站教学视频,销售网站有哪些?  如何通过老薛主机一键快速建站?  如何快速搭建高效WAP手机网站吸引移动用户?  如何通过西部建站助手安装IIS服务器?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  行程制作网站有哪些,第三方机票电子行程单怎么开?  在线制作视频网站免费,都有哪些好的动漫网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  长沙企业网站制作哪家好,长沙水业集团官方网站?  全景视频制作网站有哪些,全景图怎么做成网页?  建站之星安装需要哪些步骤及注意事项?  ,sp开头的版面叫什么? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。