有没有办法在 C++ 中捕获所有异常? [复制]

Posted

技术标签:

【中文标题】有没有办法在 C++ 中捕获所有异常? [复制]【英文标题】:Is there a way to catch all exceptions in C++? [duplicate] 【发布时间】: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 (...) ; 之类的操作(即默默地吃掉任何/所有可能的例外情况)。 【参考方案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 块中的另一个处理程序捕获的异常。

【讨论】:

以上是关于有没有办法在 C++ 中捕获所有异常? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

你能在每个块中捕获不止一种类型的异常吗? [复制]

Rails:在 Rails 控制器中捕获所有异常

php中,用try/catch捕获了异常,为啥还会有警告?有没有办法去掉呢?

拦截 C# 中的所有异常,即使它们已经被捕获 [重复]

捕获所有错误 psql 函数异常

c++ 捕获所有异常