C++自定义异常what()返回"std::exception"而非自定义原因的问题
问题分析与解决
你的自定义异常类没有正确重写std::exception的what()方法,导致通过基类引用捕获时调用的是基类的默认实现,所以输出"std::exception"。
核心问题:方法签名不匹配
std::exception的what()方法签名是:
virtual const char* what() const noexcept;
而你的代码中what()缺少**const修饰符**,这意味着你并没有重写基类方法,而是定义了一个同名的新方法。当你通过const std::exception&类型的引用调用what()时,编译器会选择基类的const版本,而非你定义的非const版本。
修正后的代码
#include <stdexcept> #include <iostream> #include <string> class CustomException : public std::exception { public: std::string m_reason; CustomException(std::string reason) : m_reason(std::move(reason)) {} // 用move减少字符串拷贝 // 严格匹配基类签名,加上override确保重写正确(C++11及以上) const char* what() const noexcept override { return m_reason.c_str(); } }; void function() { throw CustomException("no reason"); } int main() { try { function(); } catch (const std::exception& e) { std::cout << e.what() << std::endl; // 现在会输出"no reason" } }
额外说明
- 加上
override关键字后,编译器会检查当前方法是否真的重写了基类的虚方法,如果签名不匹配会直接报错,能有效避免这类隐蔽的错误。 - 添加
noexcept是为了和基类方法的异常规格保持一致,符合C++标准的要求。 - 构造函数中使用
std::move(reason)可以减少std::string的拷贝操作,提升代码效率。
内容的提问来源于stack exchange,提问作者jonathan-dev
相关产品推荐
相关产品推荐

