C++"catch(...)"参数

zeb*_*und 6 c++ arguments

我最近在一些c ++代码中看到了一些有趣的东西:

try {
   //doStuff
} catch ( ... ) {
  //doStuff
}
Run Code Online (Sandbox Code Playgroud)

"......"就是我指的.

现在,乍一看,人们可能会认为这只不过是一个填充物,就像我们看到的类似于"doStuff"的评论.奇怪的是,在Eclipse CDT中输入它实际上是有效的,没有给出任何语法错误.

这有什么特别的目的吗?

Alo*_*ave 7

这是一个抓住所有.
它将捕获抛出的任何类型的异常.
使用它时确保它放在所有捕获处理程序的末尾,否则它将捕获所有异常,而不管类型如何.


era*_*ran 6

正如其他人所提到的那样,它捕获了一切.从我所看到的,当你无法识别抛出的实际异常时,主要使用它.如果该异常是结构化异常(这不是C++ 异常),则可能发生这种情况.例如,如果您尝试访问某些无效的内存位置.使用那些"全部捕获"通常不是一个好习惯.您没有(便携式)方式来获取堆栈跟踪,并且您不了解抛出的异常.

使用这个除了示例或非常简单的案例之外的原因可能表明作者试图通过不对未识别的异常进行适当的处​​理来隐藏程序的不稳定性.如果您遇到过这样的情况,最好让程序崩溃,并创建一个可以在以后分析的崩溃转储.或者,使用结构化异常处理程序(如果您使用VS - 不知道如何在其他编译器上完成此操作).