【问题标题】:C++ "catch (...)" parameterC++“catch (...)”参数
【发布时间】:2011-10-08 05:31:07
【问题描述】:

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

try {
   //doStuff
} catch ( ... ) {
  //doStuff
}

我指的是“...”。

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

这样做有什么特殊目的吗?

【问题讨论】:

  • 之所以选择这种特殊语法可能是因为它与自然英语约定相似。

标签: c++ arguments


【解决方案1】:

正如其他人所提到的,它可以捕获所有内容。从我所见,这主要用于当您无法识别引发的实际异常时。如果该异常是 Structured Exception(不是 C++ 异常),则可能会发生这种情况。例如,如果您尝试访问一些无效的内存位置。使用那些“包罗万象”通常不是一个好习惯。您没有(便携式)方法来获取堆栈跟踪,并且您对抛出的异常一无所知。

出于示例或非常琐碎的案例以外的原因使用它可能表明作者试图通过不适当处理无法识别的异常来隐藏程序的不稳定性。如果你遇到过这样的情况,你最好让程序崩溃,然后创建一个崩溃转储,以便以后分析。或者,使用structured exception handler(如果您使用的是 VS - 不知道在其他编译器上是如何完成的)。

【讨论】:

    【解决方案2】:

    这是一个包罗万象。它会捕获任何类型的异常抛出。

    使用它时,请确保将它放在所有 catch 处理程序的末尾,因为它只会捕获所有异常,而与类型无关。 (在标准 C++ 中,如果 catch-all 不是最后一个处理程序,则会出错。)

    【讨论】:

      【解决方案3】:

      那是“捕捉省略号”,意思是“捕捉任何抛出的异常并在此处处理它们”。与catch( SpecificType ) 不同,catch(...) 只会捕获某些类型的异常,catch(...) 会捕获所有 C++ 异常。

      【讨论】:

      • 除了,没有办法得到实际的异常对象。 :-(
      • @Chris,实际上有一种方法......你可以重新抛出它并再次捕获。听起来没什么用,但它允许您将常见的异常处理转移到一个单独的函数中。 try{ something() }catch(...){ handle_errors(); } 然后void handle_errors(){ try{ throw }catch( MyErrorA& ){ //its a A }catch( MyErrorB& ){ //its a B } //Else it gets rethown for someone else to catch }.
      【解决方案4】:

      如果有一些异常可以从 try 块中返回,你可能不知道或者你不想专门处理,你可以放那个代码。 它将捕获所有异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-09
        • 2011-08-31
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多