我正在用C ++编写命令行应用程序。如果发生未处理的异常,我不希望应用程序崩溃,但要尽可能清理并打印错误消息。
如何在顶层捕获异常以避免程序崩溃?我应该抓住std::exception
,...
还是其他什么?
答案 0 :(得分:4)
您可以做的清洁质量是抛出异常的函数。
例如,您自己提出的异常(可能来自std::exception
;让我们称之为fooexception
)可以很好地处理。
所以你真的想在这些线上找到一个捕获网站
try {
/*whatever*/
} catch (fooexception& fe){
/*ToDo - handle my exception*/
} catch (std::exception& e){
/*ToDo - handle this generically*/
} catch (...){
/*Hum. That's bad. Let's do my best*/
}
随意扩展。请记住,在某种意义上,多个catch
块的行为类似于if
else
块:始终首先按特定的例外排序。
答案 1 :(得分:3)
嗯,你可以抓住两个:
int main() {
try {
// do stuff
}
catch(const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
catch(...) {
std::cout << "Caught unknown exception." << std::endl;
}
}
答案 2 :(得分:1)
你应该抓住两者,甚至更多。如果在调用堆栈中的某处使用更具体的异常类型,请尝试捕获它。
考虑代码:
try
{
process();
}
catch (const SpecificException& ex)
{
std::cerr << "SpecificException occured: " << ex.what() << std::endl;
}
catch (const std::runtime_error& ex)
{
std::cerr << "std::runtime_error occured: " << ex.what() << std::endl;
}
catch (...)
{
std::cerr << "Unknown error occured!" << std::endl; // should never happen hopefully
}
并且记住始终按异常的特定性排序 - 首先是更专业化/派生的,因为运行时将停止在能够处理异常的第一个catch块(即具有异常类型匹配或作为基础的第一个catch块)