今天我在C#工作并试图抓住FileNotFoundException
。但是在我添加using System.IO
之前我无法这样做。
为什么FileNotFoundException
包含在System.IO
命名空间而不包含在System
命名空间中?
我知道FileNotFoundException
只会由IO引起,因此可能就是原因。但另一方面,所有Exception
都不应该在System
命名空间中吗?
答案 0 :(得分:6)
属于一起的代码应该保存在一起。这是OOP所属的key aspects of modular programming之一。
System.IO
中的代码是可能抛出FileNotFoundException
的代码,而不是任何其他代码。
与SqlException
命名空间中的System.Data.SqlClient
相同。
将所有类型的异常放在一起是没有意义的,特别是对于某些特定于某些用法(例如数据库访问)的异常类型。
答案 1 :(得分:2)
我知道
FileNotFoundException
只会由IO引起, 因此也许是原因。但另一方面,不应该全部 例外情况会保留在例外情况下吗?
下面是heirarchy,显示FileNotFoundException
所在的位置。所以回答你的问题是Exception class
System.Object
System.Exception
System.SystemException
System.IO.IOException
System.IO.FileNotFoundException
答案 2 :(得分:2)
这样想:你在自己的CustomClass
中创建自己的CustomNamespace
。 CustomException
在CustomNamespace
内定义是否有意义,因为这是理解其背景的地方?
另外,想象一下如果在一个地方定义了每个异常类型。一团糟!
我们使用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