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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:07:39