因此在参考手册中,what()方法被描述为虚拟,但似乎并没有这样做。 (我正在使用g ++和c ++ 11标志进行编译)
#include <stdio.h> //printf
#include <iostream> //cout
#include <stdexcept>// std::invalid_argument
using namespace std;
void fn(){
throw runtime_error("wowwowo");
}
int main(){
try {fn(); }
catch(exception a) {cout << a.what() << endl;}
return 0;
}
此输出为“std :: exception”,而不是错误消息“wowwowo”。但是,如果我将catch类型更改为runtime_error,它将按预期运行。我有一些代码,我想捕获可能或可能不是runtime_errors的异常,我想我可以有多个catch块,但我很好奇为什么代码行为与它一样。这是打印出错误消息的代码:
#include <stdio.h> //printf
#include <iostream> //cout
#include <stdexcept>// std::invalid_argument
using namespace std;
void fn(){
throw runtime_error("wowwowo");
}
int main(){
try {fn(); }
catch(runtime_error a) {cout << a.what() << endl;}
return 0;
}
答案 0 :(得分:11)
更改此声明:
catch(exception a) {cout << a.what() << endl;}
到此:
catch(const exception &a) {cout << a.what() << endl;}
您必须通过引用捕获异常才能使用多态性。否则,您正在对std::runtime_error
对象进行切片,因此只剩下std::exception
个对象,因此将调用std::exception::what()
而不是std::runtime_error::what()
。
至于函数本身,它确实是virtual
函数。
class exception {
public:
//...
virtual const char* what() const noexcept;
};