You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义std::exception派生类:需实现what()还是调用基类构造?

自定义FilterException类的实现选择:自行编写what()还是调用基类构造?

嘿,针对你这个自定义异常类的疑问,咱们来掰扯清楚两种实现方式的区别,再看哪种更适合你的场景:

一、维持当前实现的优势

  • 完全掌控消息存储:你的error_message作为类成员(应该是std::string类型吧?从c_str()调用能看出来),可以确保what()返回的字符串指针在异常对象的生命周期内始终有效,不会出现悬空指针的问题。
  • 扩展性更强:后续如果想在错误消息里加入错误码(比如返回"XXX错误,错误码:123"),直接修改what()函数就行,比如提前把消息和错误码拼接好存到error_message里,就能轻松实现需求。
  • 独立于基类实现:不用依赖std::exception对消息存储的具体实现,避免不同编译器可能存在的差异问题。

二、改为调用基类构造、移除自定义what()的局限

如果改成构造函数调用std::exception(message),然后去掉自己的what(),会有这些明显的局限:

  • 无法扩展错误消息:基类的what()只会返回你构造时传入的原始消息,没法把你额外的error_number整合进去——而你已经提供了getErrorNumber(),说明这个错误码是业务需要的,后续大概率会有把消息和码结合的需求。
  • 依赖基类的存储逻辑:虽然C++11之后标准要求std::exception妥善管理传入的消息,但不同编译器的实现可能有差异,比如有些早期实现可能只是保存指针而非拷贝字符串,如果你传入的是栈上的临时字符串,就会导致what()返回无效指针。

总结建议

更推荐维持你当前的实现,它既满足了你扩展错误码的需求,又给了后续修改错误消息格式的灵活性,还能避免基类实现带来的不确定性。唯一要注意的是确保error_message是std::string类型的成员变量,这样c_str()返回的指针才不会失效。

内容的提问来源于stack exchange,提问作者smiljanic997

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:03