为什么.NET设计者不会在System命名空间中保留所有异常?

时间:2012-08-02 15:06:33

标签: c# namespaces

今天我在C#工作并试图抓住FileNotFoundException。但是在我添加using System.IO之前我无法这样做。

为什么FileNotFoundException包含在System.IO命名空间而不包含在System命名空间中?

我知道FileNotFoundException只会由I​​O引起,因此可能就是原因。但另一方面,所有Exception都不应该在System命名空间中吗?

5 个答案:

答案 0 :(得分:6)

属于一起的代码应该保存在一起。这是OOP所属的key aspects of modular programming之一。

System.IO中的代码是可能抛出FileNotFoundException的代码,而不是任何其他代码。

SqlException命名空间中的System.Data.SqlClient相同。

将所有类型的异常放在一起是没有意义的,特别是对于某些特定于某些用法(例如数据库访问)的异常类型。

答案 1 :(得分:2)

  

我知道FileNotFoundException只会由I​​O引起,   因此也许是原因。但另一方面,不应该全部   例外情况会保留在例外情况下吗?

下面是heirarchy,显示FileNotFoundException所在的位置。所以回答你的问题是Exception class

的孩子(比如说大孩子)
System.Object 
  System.Exception
    System.SystemException
      System.IO.IOException
        System.IO.FileNotFoundException

答案 2 :(得分:2)

这样想:你在自己的CustomClass中创建自己的CustomNamespaceCustomExceptionCustomNamespace内定义是否有意义,因为这是理解其背景的地方?

另外,想象一下如果在一个地方定义了每个异常类型。一团糟!

我们使用namespaces向我们提供上下文逻辑组织我们的类型。

答案 3 :(得分:2)

FileNotFoundException是一个派生自Exception的类(或者更准确地说,派生自最终派生自Exception).的一系列类,你无法真正放置FileNotFoundException在“Exception之下”,除非你在谈论使它成为一个内部类。但是这需要将它放在与Exception相同的程序集中,而Exception根本不会扩展。处理System.SomeNewFeature.dll的团队想要创建一个例外,他们无法将mscorlib.dll放入System - 它必须包含在他们的代码中。

除了这样做的必要性之外,他们可能只是将它推到他们想要的任何名称空间中。但从分组/组织的角度来看,它才有意义。您只能(快速)访问与您正在处理的内容相关的Exception。如果他们全都在{{1}},那就太疯狂了。

答案 4 :(得分:1)

通常,您希望将异常保留在它们处理的范围内(保持代码分组)。如果您考虑一下,将FileNotFoundException置于System.IO处理文件系统交互。即使异常不在System.Exception命名空间中,它仍然继承System.Exception形式。其他一些代码抛出FileNotFoundException的可能性很小。就像与文件系统交互的东西不太可能抛出System.Net.WebException