今天我在 C# 中工作并试图抓住一个FileNotFoundException
. 但直到我添加using System.IO
.
为什么被FileNotFoundException
包含在System.IO
命名空间中而不是System
命名空间中?
我知道这FileNotFoundException
将仅由 IO 引起,因此可能是原因。但另一方面,所有Exception
s 不应该都在System
命名空间中吗?
今天我在 C# 中工作并试图抓住一个FileNotFoundException
. 但直到我添加using System.IO
.
为什么被FileNotFoundException
包含在System.IO
命名空间中而不是System
命名空间中?
我知道这FileNotFoundException
将仅由 IO 引起,因此可能是原因。但另一方面,所有Exception
s 不应该都在System
命名空间中吗?
属于一起的代码应该放在一起。这是OOP所属的模块化编程的关键方面之一。
中的代码System.IO
是可能抛出 的代码FileNotFoundException
,而不是任何其他代码。
SqlException
与命名空间中的方式相同System.Data.SqlClient
。
将所有类型的异常放在一起是没有意义的,特别是对于特定于某些用途(如数据库访问)的异常类型。
我知道这
FileNotFoundException
将仅由 IO 引起,因此可能是原因。但另一方面,不应该把所有的异常都放在异常下吗?
下面是显示位置的层次结构FileNotFoundException
。因此,要回答您的问题,它是Exception class
System.Object
System.Exception
System.SystemException
System.IO.IOException
System.IO.FileNotFoundException
可以这样想:您自己创建自己CustomClass
的CustomNamespace
. CustomException
将您定义在其中是否有意义,CustomNamespace
因为这是理解其上下文的地方?
另外,想象一下如果每个异常类型都定义在一个地方。一团糟!
我们使用命名空间来为我们提供上下文并在逻辑上组织我们的类型。
FileNotFoundException
是派生自Exception
(或更准确地说,派生自最终派生自 的类链)的类Exception
。除非您正在谈论使其成为内部类,否则您不能真正将其置于FileNotFoundException
“之下” 。Exception
但这需要将它放在与 相同的程序集中Exception
,这根本无法扩展。当工作的团队System.SomeNewFeature.dll
想要创建一个异常时,他们无法将其放入mscorlib.dll
-Exception
它必须放入他们的代码中。
除了这样做的必要性之外,他们还可以将它推到他们想要的任何名称空间中。但这只是从分组/组织的角度来看才有意义。您只能(快速)访问与Exception
您正在处理的内容相关的 s。如果他们都在,System
那将是疯狂的复杂。
通常,您希望将您的异常保持在他们处理的范围内(保持您的代码分组)。如果你想一想,putFileNotFoundException
是有意义的,System.IO
因为它处理文件系统交互。即使异常不在System.Exception
命名空间中,它仍然继承自 System.Exception。其他一些代码不太可能抛出FileNotFoundException
. 就像与文件系统交互的东西不太可能抛出一个System.Net.WebException