c# - 关于 catch block 中 catch 语句顺序的问题 - 特定于编译器或语言标准?

标签 c# java c++ exception-handling catch-block

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

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

catch (MyException)
{
}
catch (...)
{
}

而以下不会:

catch (...)
{
}
catch (MyException)
{
}

一个。请问这是在C++语言标准中定义的,还是微软编译器严格的问题?

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

顺便说一句,我还尝试制作一个基类和一个派生类,并将基类的 catch 语句放在派生类的 catch 语句之前。这编译没有问题。请问有没有语言标准来防止这种做法?

最佳答案

按照标准,顺序很重要。基本上匹配异常的第一个catch 将被捕获。

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

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

c) 在派生类之前捕获(通过引用或指针)基类将使派生类的代码变得无关紧要。但是,标准确实允许这样做

关于c# - 关于 catch block 中 catch 语句顺序的问题 - 特定于编译器或语言标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405115/

相关文章:

java - Blackberry - 如何在不使用 JDE 或 Eclipse 插件的情况下指定应用程序主方法的参数?

java - 如何在 Spring Web 应用程序中实现文件夹上传?

C++ - Fastor vs. Eigen vs C-tran : Speed differences in tensor contraction

c++ - 新建一个新类对象的功能;错误 : A nonstatic member reference must be relative to a specific object

c# - 手动创建字符串资源文件不适用于应用程序

java - 由 : java. lang.UnsupportedOperationException 引起:在读取之前必须拆分 BigQuery 源

c# - 如何避免动态加载已使用反射加载的程序集?

java - 工厂内部的 If 语句过多

c# - 运行所选代码生成器时出错 : 'Object reference not set to an instance of an object.' Error?

c# - 使用C#将文本框中的数据写入ASP.net中的文本文件