自定义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
相关产品推荐
相关产品推荐

