1

今天我在 C# 中工作并试图抓住一个FileNotFoundException. 但直到我添加using System.IO.

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

我知道这FileNotFoundException将仅由 IO 引起,因此可能是原因。但另一方面,所有Exceptions 不应该都在System命名空间中吗?

4

5 回答 5

6

属于一起的代码应该放在一起。这是OOP所属的模块化编程的关键方面之一。

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

SqlException与命名空间中的方式相同System.Data.SqlClient

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

于 2012-08-02T15:11:14.433 回答
2

我知道这FileNotFoundException将仅由 IO 引起,因此可能是原因。但另一方面,不应该把所有的异常都放在异常下吗?

下面是显示位置的层次结构FileNotFoundException。因此,要回答您的问题,它是Exception class

System.Object 
  System.Exception
    System.SystemException
      System.IO.IOException
        System.IO.FileNotFoundException
于 2012-08-02T15:11:12.460 回答
2

可以这样想:您自己创建自己CustomClassCustomNamespace. CustomException将您定义在其中是否有意义,CustomNamespace因为这是理解其上下文的地方?

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

我们使用命名空间来为我们提供上下文并在逻辑上组织我们的类型。

于 2012-08-02T15:12:22.907 回答
2

FileNotFoundException是派生自Exception(或更准确地说,派生自最终派生自 的类链)的类Exception除非您正在谈论使其成为内部类,否则您不能真正将其置于FileNotFoundException“之下” 。Exception但这需要将它放在与 相同的程序集中Exception,这根本无法扩展。当工作的团队System.SomeNewFeature.dll想要创建一个异常时,他们无法将其放入mscorlib.dll-Exception它必须放入他们的代码中。

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

于 2012-08-02T15:12:37.840 回答
1

通常,您希望将您的异常保持在他们处理的范围内(保持您的代码分组)。如果你想一想,putFileNotFoundException是有意义的,System.IO因为它处理文件系统交互。即使异常不在System.Exception命名空间中,它仍然继承自 System.Exception。其他一些代码不太可能抛出FileNotFoundException. 就像与文件系统交互的东西不太可能抛出一个System.Net.WebException

于 2012-08-02T15:13:42.160 回答