省略号尝试赶上c ++

时间:2011-10-12 18:29:55

标签: c++ try-catch

是否可以使用省略号try-catch来捕获可能导致崩溃的所有错误?有异常吗?

try
{
//some operation
}
catch(...)
{
}

4 个答案:

答案 0 :(得分:12)

不,它只能捕获C ++异常,而不是像segfault,SIGINT等。

您需要阅读并理解C ++异常与缺少更好的单词“C风格”信号(如SIGINT)之间的区别。

答案 1 :(得分:1)

Catch All处理程序 它捕获从try块抛出的所有C ++异常。它不会捕获导致程序崩溃的段错误和其他信号。

在使用它时,您需要将此处理程序放在所有其他特定catch处理程序的末尾,否则所有异常将最终被此处理程序捕获。

使用catch all handler是一个坏主意,因为它只是掩盖了你的问题,并通过捕获所有(甚至无法识别的)异常来隐藏程序的无能。如果您遇到这种情况,最好让程序崩溃,并创建一个崩溃转储,您可以稍后分析并解决问题的根源。

答案 2 :(得分:1)

如果try / catch块中的代码以某种方式崩溃,程序无论如何都处于不可恢复状态。你不应该试图阻止崩溃,程序可以做的最好就是让进程崩溃。

“异常”是指您的代码仅捕获异常,而不是错误。即使代码是异常安全的(可能不是这种情况,如果你试图通过try / catch块来解决它的错误),任何其他内部错误都可能使程序进入不可恢复的状态。没有办法保护程序免受它的侵害。


另外:请查看this article at "The Old New Thing"以获得一些见解。

答案 3 :(得分:0)

它可以捕获所有抛出的内容,不仅限于例外。它不处理诸如Windows调试断言,系统信号,段错误之类的事情。

TEST(throw_int) {
    try {
        throw -1;
    } catch (std::exception &e) {
        std::cerr << "caught " << e.what() << std::endl;
    } catch (...) {
        std::cerr << "caught ..." << std::endl;
    }
}

虽然不推荐投掷整数。扔掉一些继承自std::exception

的东西会更好

尽管如此,你可能会看到这样的事情是记录失败的最后努力。某些应用程序不需要非常强大。内部工具的成本可能超过它们的价值,如果你经历了使它们比被黑客攻击更好的步伐。

int main(int argc, char ** argv) {
    try {
        // ...
    } catch (std::exception &e) {
        std::cerr << "error occured: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}