如果我这样做:
//... 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
,我会得到正确的消息。
1条答案
按热度按时间6bc51xsx1#
您没有遇到“对象切片”,因为您没有通过值捕获
exception
。std::exception::what()
是一个virtual
方法,但是您没有正确地覆盖它,这就是为什么没有按预期调用MyCustomException::what()
的原因。如果你使用的是C11或更高版本,你可以在编译时使用override
关键字来捕获这个错误,但这个选项在C98中不可用。MyCustomException::what()
需要在C++98中像下面这样声明,以覆盖std::exception::what()
:示例:
输出: