在C ++命令行应用程序中,如何在顶层捕获异常?

时间:2016-05-06 12:18:38

标签: c++ exception exception-handling

我正在用C ++编写命令行应用程序。如果发生未处理的异常,我不希望应用程序崩溃,但要尽可能清理并打印错误消息。

如何在顶层捕获异常以避免程序崩溃?我应该抓住std::exception...还是其他什么?

3 个答案:

答案 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块)