C# 关于catch块编译器特定或语言标准中catch语句顺序的问题? 我目前使用VisualStudioExpress C++ 2008,并且关于catch块排序有一些问题。不幸的是,我在网上找不到答案,所以我向专家们提出了这些问题

C# 关于catch块编译器特定或语言标准中catch语句顺序的问题? 我目前使用VisualStudioExpress C++ 2008,并且关于catch块排序有一些问题。不幸的是,我在网上找不到答案,所以我向专家们提出了这些问题,c#,java,c++,exception-handling,catch-block,C#,Java,C++,Exception Handling,Catch Block,我注意到,除非catch(…)放在catch块的末尾,否则编译将失败,并出现错误C2311。例如,将编译以下内容: catch (MyException) { } catch (...) { } 但以下情况不会: catch (...) { } catch (MyException) { } a。请问这是在C++语言标准中定义的,还是这只是微软编译器严格的?< /P> b。C#和Java也有相同的规则吗 c。另一方面,我还尝试创建基类和派生类,并将基类的catch语句放在派生类的catch语

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

catch (MyException)
{
}
catch (...)
{
}
但以下情况不会:

catch (...)
{
}
catch (MyException)
{
}
a。请问这是在C++语言标准中定义的,还是这只是微软编译器严格的?< /P> b。C#和Java也有相同的规则吗

c。另一方面,我还尝试创建基类和派生类,并将基类的catch语句放在派生类的catch语句之前。这本书没有问题。有没有语言标准来防范这种做法?请从< C++标准> 33/5“处理异常”< < /P> < >:< /P> try块的处理程序按外观顺序进行尝试。这使得编写永远无法执行的处理程序成为可能,例如,将派生类的处理程序放在相应基类的处理程序之后

处理程序的异常声明函数中的
..
类似于函数参数声明中的
..
;它指定任何异常的匹配项。如果存在,
处理程序应是其try块的最后一个处理程序


根据标准,顺序是重要的。基本上,将捕获与异常匹配的第一个捕获

a) 因为
catch(…)
会使任何后续捕获变得无关,所以标准只允许它是最后一个捕获

b) C#和Java有相似的规则


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

所谓的默认处理程序
catch(…)
必须是处理程序列表中的最后一个处理程序。这确实是标准所要求的。但是,此要求特定于默认处理程序

否则,该标准不会限制处理程序的顺序,这意味着通常可以创建一个处理程序,该处理程序将“截获”所有异常,否则这些异常将到达列表中的其他处理程序(从而使后一个处理程序无用)

此外,重复相同的
catch
子句(使用相同的类型)几次是完全合法的

catch (int) {
  // ...
}
catch (int) {
  // ...
}

即使只有第一个有机会抓住任何东西。一个好的编译器会对这样的情况发出警告,但在形式上这不是一个错误。

知道标准为什么不禁止它吗?看起来像是一个愚蠢的陷阱,很容易通过错误的形式避免。迈克尔,谢谢你的回答。约翰,谢谢你的问题——这也是我想知道的。@litb:完全不知道。我对任何可能知道(或有好的猜测)的人的评论感兴趣。a)是真的(前两句)。catch(…)是特殊情况,因为没有后面的子句可以匹配,所以后面的子句是完全禁止的。根据这两个注释重新编写。感谢Johannes和BenRe(B):C#规范的第8.10节详细描述了这在C#中是如何工作的。详情请参阅。Re(C)在C#中是非法的。有关详细信息,请参见第8.10节。谢谢。我不知道可以有两个catch语句捕获完全相同的数据类型!