关于catch块中catch语句的排序的问题 - 编译器特定或语言标准?

And*_*ndy 5 c# c++ java exception-handling catch-block

我目前正在使用Visual Studio Express C++ 2008,并且对catch块排序有一些疑问.不幸的是,我无法在互联网上找到答案,所以我向专家提出这些问题.

我注意到除非catch(...)放在catch块的末尾,否则编译将失败,错误C2311.例如,以下内容将编译:

catch (MyException)
{
}
catch (...)
{
}
Run Code Online (Sandbox Code Playgroud)

而以下不会:

catch (...)
{
}
catch (MyException)
{
}
Run Code Online (Sandbox Code Playgroud)

一个.我是否可以问这是否是在C++语言标准中定义的,或者这只是Microsoft编译器是严格的?

湾 C#和Java也有相同的规则吗?

C.另外,我还尝试创建基类和派生类,并在派生类的catch语句之前放置基类的catch语句.这编译没有问题.请不要有语言标准来防范这种做法吗?

And*_*ein 5

根据标准,订单很重要.基本上,将捕获匹配异常的第一个catch.

a)因为catch(...)将使任何后续捕获无关紧要,标准只允许它成为最后一个捕获.

b)C#和Java有类似的规则.

c)在派生类使得派生的代码不相关之前捕获(通过引用或指针)基数.但是,该标准确实允许这样做