【问题标题】:Is there a way to catch all exceptions in C++? [duplicate]有没有办法在 C++ 中捕获所有异常? [复制]
【发布时间】:2012-02-27 02:34:40
【问题描述】:

可能重复:
How can I catch all types of exceptions in one catch block?

在 C++ 中有没有办法捕获所有异常?如果是这样,它的语法是什么?

谢谢

【问题讨论】:

  • 你需要澄清一下;您是指所有异常还是所有未处理异常?毕竟,你可以像 Seth 提到的那样将入口点包装在 try-catch 块中,但如果有内部代码显式处理异常并让程序继续运行,它就不会到达入口点 catch 块。
  • 如果您这样做是为了调试异常,那么在 Visual Studio 中有一种更简单的方法;在调试菜单上转到 Exceptions 选项,您可以选择 VS 在发生异常时停止的选项,即使它已被处理,以及其他一些事情。
  • 顺便说一句,这通常是“糟糕的形式”。特别是如果您执行try { ... } catch (...) { ; } 之类的操作(即默默地吃掉任何/所有可能的例外情况)。

标签: c++


【解决方案1】:

是的,您可以通过catching ... 捕获内部try/catch 块未处理(且未重新抛出)的所有异常:

try {
    // do some stuff
} catch (...) {
    // catch any exceptions that weren't handled and/or rethrown in the try block
}

您也可以将其与其他 catches 结合使用,但请确保它们在 catch (...) 之上,否则它们将被 catch-all 所掩盖(您应该会收到编译器错误)。

【讨论】:

  • 这不一定会捕获 any 异常,因为在内部 try-catch 块中处理并且不会停止程序执行的异常不会被冒泡。跨度>
  • @RussC 确实如此,但使用 C++ 无法捕获所有异常。
  • 同意,但您的措辞无意中具有误导性;只是想确保 OP 知道异常范围。
  • @RussC 好的,我澄清了一点。
【解决方案2】:

你可以像这样捕获所有异常

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

不过更有用的做法是捕获特定异常,然后最终落入 (...)

try{
    // ...
} catch (const std::exception& ex) {
    // ...
} catch (const std::string& ex) {
    // ...
} catch (...) {
    // ...
}

【讨论】:

    【解决方案3】:

    不,您无法捕获所有异常,因为您无法捕获已被嵌套在 try/catch 块中的另一个处理程序捕获的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2020-09-20
      • 2021-10-26
      相关资源
      最近更新 更多