c++ std::exception“what()”消息在自定义异常中总是只打印“std::exception”-为什么我不能让它打印内容?

yduiuuwa  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(202)

如果我这样做:

//... in .h header:

class MyCustomException : public std::exception{
  private:
    string message;

  public:
    MyCustomException (string msg); //in .cpp implements "message = msg"
    ~MyCustomException() throw(){ }
    string what(); //implemented to return message.

}
//... other code ... in cpp:

if (<blah blah blah>){
  throw MyCustomException("I want to see THIS message when I fail ... but I don't...");
}

//... more code, in cpp:

//try{<blah...>}
catch(const:: std::exception& e){
   cout << e.what() << endl << flush; //just prints "std::exception" ... same if I use "cerr" instead of cout.
}

回复前的重要注意事项:
密码所在的电脑无法与外界通讯,所以我输入了这个……因此,如果有小的明显错别字,知道我可能有它的正确。
由于我公司的传统工业设备,我被C98卡住了,所以我想我不能访问std::current_exception,它是C11这样的更高版本。
但是,我可以让#include <cxxabi.h>工作,这允许我<demangle>(__cxxabivl::__cxa_current_exception_type()->name()) ...但这仍然只是MyCustomException的名称,而不是它的what()消息。
我可以尝试捕获每个异常并打印其what()消息……但应该有更简单的方法对吧
我发现文档令人困惑,只找到了一个type_info*,我认为它并不指向实际的原始异常对象(理论上我可以从中提取正确的what()消息)。
有没有办法在catch中添加一个通用的<T>来处理任何异常,这样我就可以打印MyCustomException对象的消息,而不是它的超级父对象的消息(即std::exception)虚拟what()消息?我试过了,但没用。
注意:是的,我使用catch(const std::exception e) ...但是打印父对象的“对象切片”问题仍然发生。
注意:如果我捕获MyCustomException,我会得到正确的消息。

6bc51xsx

6bc51xsx1#

您没有遇到“对象切片”,因为您没有通过值捕获exception
std::exception::what()是一个virtual方法,但是您没有正确地覆盖它,这就是为什么没有按预期调用MyCustomException::what()的原因。如果你使用的是C11或更高版本,你可以在编译时使用override关键字来捕获这个错误,但这个选项在C98中不可用。
MyCustomException::what()需要在C++98中像下面这样声明,以覆盖std::exception::what()

const char* what() const throw()

示例:

#include <exception>
#include <iostream>
#include <string>

class MyCustomException : public std::exception {
public:
    MyCustomException(const std::string& msg) throw() : message(msg) {}
    virtual ~MyCustomException() throw() {}

    const char* what() const throw() { return message.c_str(); }

private:
    std::string message;
};

int main() {
    try {
        throw MyCustomException(
            "I want to see THIS message when I fail ... but I don't...");
    } catch (const std::exception& e) {
        std::cout << e.what() << '\n';
    }
}

输出:

I want to see THIS message when I fail ... but I don't...

相关问题