2010-01-25 78 views
7

FormatException是不是继承自ArgumentException?一个无效的格式似乎是一个非常具体的无效论据,类似于ArgumentOutOfRangeException为什么FormatException不会从ArgumentException继承?

MSDN article for the class状态:

出现FormatException当在一个方法调用的参数的格式不匹配对应的形参类型的格式被抛出。例如,如果一个方法指定一个String参数,该参数由包含句点的两位数字组成,则将包含两位数的相应字符串参数传递给该方法会导致引发FormatException

听起来就像是ArgumentException或派生类的情景。

所有这一切都意味着,你不能FormatException处理较大ArgumentException例外族下,也不能确定哪个参数导致引发异常。

没有任何理由为这个看似外的地方是例外,它在哪里?

回答

13

FormatException时的方法的正式说法是无效不一定抛出。如果该方法使用外部资源并且来自外部资源的数据格式不合适,也会发生这种情况。

例如,如果要从流中读取的内容不是有效的7位编码整数,则BinaryReader.Read7BitEncodedInt将抛出FormatException。它根本没有任何争论。另一方面,只有当作为形式参数传递给方法的参数无效时才应该抛出该异常。

您从MSDN文章中引用的说明比FormatException更具限制性,应该澄清。

+0

对我来说,这是一个令人信服的论据。围绕该类的文档在使用异常时专门提到了参数时很容易引起误解。 – 2010-01-25 20:31:45

+0

Downvoter:谨慎解释?我很想知道这个答案中的内容真的是“可以降低的”。 – 2010-01-25 20:34:21

+0

这是我的错误点击,当时不会让我撤消。如果你编辑你的答案,我很乐意将其撤销。 – 2010-01-25 20:41:14

5

这是有点流鼻涕:但里希特CLR通过C#(页432)表明,也许是因为异常类层次结构并没有在.NET中实现的非常好:

微软的最初的想法是这System.Exception将是所有异常和其他两个类型,System.SystemExceptionSystem.ApplicationException将立即从Exception得到的只有两种基本类型。此外,CLR引发的异常将从SystemException派生,所有应用程序抛出的异常将从ApplicationException派生。这样,开发人员可以编写一个捕获所有应用程序抛出的异常的catch块。

但是......这条规则并没有很好地遵循;有些例外是从ExceptionIsolatedStorageException)立即得出的,一些CLR抛出的异常是从ApplicationException派生的...所以这一切都是一团糟,其结果是SystemExceptionApplicationException类型根本没有什么特殊含义。此时,Microsoft想要将它们从异常类层次结构中移除,但它们不能,因为它会破坏已引用这些类型的任何代码。

这是不完全解答您的查询,但我认为这是相关的,因为我认为这表明,确实没有一个很好的理由,为什么有些例外衍生继承他们的方式。不幸的是,Exception类的继承并不是所有这些都深思熟虑的&这是一个混乱。

相关问题