我正在使用Qt Creator 3.0.1和MinGW 4.8 32位作为编译器。
当我将以下代码放入main()
函数的最顶层时(在Qt执行其所有操作之前),我在控制台上获得的输出是“std :: exception”,而不是“Whoops”as我希望:
try {
throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
std::cout << ex.what() << std::endl;
}
我也尝试通过指针访问what()
:
try {
throw std::logic_error{"Whoops"};
}
catch (std::exception ex) {
std::exception* ex2 = &ex;
std::cout << ex2->what() << std::endl;
}
在VS2013中编译的完全相同的代码按照我的预期输出“Whoops”。
std::exception::what()
是虚拟的,为什么会发生这种情况?
答案 0 :(得分:1)
正如克里斯所说,你是slicing the information。您可以通过捕获const引用(demo)来阻止这种情况:
try {
throw std::logic_error{"Whoops"};
} catch (const std::exception& ex) {
std::cout << ex.what() << std::endl; // Whoops
}