一个省略号try-catch能否用于捕获所有可能导致崩溃的错误?是否存在任何异常情况?
try
{
//some operation
}
catch(...)
{
}
一个省略号try-catch能否用于捕获所有可能导致崩溃的错误?是否存在任何异常情况?
try
{
//some operation
}
catch(...)
{
}
不,它只会捕获C++异常,而不能捕获诸如段错误、SIGINT等其他东西。
你需要了解C++异常和“C风格”的信号(例如SIGINT)之间的区别并加以理解。
这是全捕获异常处理程序。
它可以捕获从try块抛出的所有C++异常。它不会捕获导致程序崩溃的段错误和其他信号。
在使用它时,您需要将此处理程序放置在所有其他特定catch处理程序的末尾,否则所有异常都将被该处理程序捕获。
使用全捕获异常处理程序是一个不好的主意,因为它只掩盖了问题并且通过捕获所有(甚至未经识别的)异常来隐藏了程序的无能。如果您遇到这种情况,最好让程序崩溃,并创建一个可以稍后分析并解决问题根源的崩溃转储。
throw;
进行抛出。 - Mooing Duckstd::exception
。 - Cat Plus Pluscatch(...)
子句仅针对C++异常调用。要调用它,堆栈必须足够一致,以便追溯到找到catch处理程序。在此过程中,堆栈展开将(尝试)销毁本地内容。这通常涉及一些delete
操作,因此如果堆栈非常损坏,则可能在到达处理程序之前退出到操作系统。在该处理程序中,系统极其损坏的机会实际上相当遥远。您链接的文章谈到了SetUnhandledExceptionFilter——这是完全不同的情况。 - Jerry Coffin附加:查看《The Old New Thing》中的本文获取一些见解。
throw;
语句结束 catch
块以继续抛出异常。 - Mooing Duckstd::cerr
可能会覆盖RIA流或进程间内存的缓冲区,然后在堆栈展开期间刷新。所以你是对的。最小化损害。不要使用catch (...)
。 - Mooing Duck它可以捕获所有被抛出的东西,不仅限于异常。但它无法处理像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;
}