在c++中使用省略号

ellipsis try catch on c++

本文关键字:省略号 c++      更新时间:2023-10-16

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

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

不,它只捕获c++异常,而不是像分段错误,SIGINT等。

您需要仔细阅读并理解c++异常与"C风格"信号(如SIGINT)之间的区别。

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

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


补充:看看这篇文章"旧的新东西"的一些见解。

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

在使用它的时候,你需要把这个处理程序放在所有其他特定的catch处理程序的末尾,否则你所有的异常都会被这个处理程序捕获。

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

它捕获抛出的所有内容,它不限于异常。它不处理诸如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;
}