catch(...) 实际上捕获所有异常吗?

Posted

技术标签:

【中文标题】catch(...) 实际上捕获所有异常吗?【英文标题】:Does catch(...) actually catch all exceptions? 【发布时间】:2011-11-21 06:07:05 【问题描述】:

我看到 catch (...) 没有捕获所有异常,并且最终用户会抛出一个恼人的弹出窗口。

size_t pos;
char *ptrDir="c:\\test";
std::string strDir = 
strDir.erase(strlen(ptrDir) - 1);
pos = strDir.find("Test");
try

    std::string strPat = strDir.substr(pos);

catch(...)

    std::cout<<"I am hiding Exception";

我使用的是 Visual Studio 2005,Windows XP。

注意:代码是有意生成异常的。这是一个测试代码

【问题讨论】:

您一定是在谈论诸如访问冲突之类的异常,它们不是标准 C++ 异常——它们是结构化异常处理的一部分:gamedev.net/page/resources/_/technical/general-programming/… 也许这与SEH exceptions有关?可能你也需要抓住它们。 注意:结构化异常不是 C++ 异常(因此不是语言的一部分)。它们是操作系统的一部分,而不是语言的一部分,尽管 DevStudio 提供了额外的语言扩展来捕获和操作它们。 【参考方案1】:

您的代码可能会产生访问冲突,这在 VC++ 中不会是标准异常,它们属于结构化异常的领域,您也可以捕获这些异常,但需要使用不同的机制:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx

Structured Exception Handling

【讨论】:

以上是关于catch(...) 实际上捕获所有异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

子类 catch 块会捕获已检查的父异常吗?

springboot中有了全局异常捕获,还需要try catch吗?

我可以在同一个 catch 子句中捕获多个 Java 异常吗?

try-catch默认捕获所有异常

c++ 捕获所有异常

try catch 捕获不到后台异常