为什么FormatException不从ArgumentException继承?

Pau*_*ner 9 .net exception argumentexception formatexception

有没有已知的原因FormatException不继承ArgumentException?无效格式似乎是一个非常具体的参数无效的情况,类似于ArgumentOutOfRangeException.

该类MSDN文章指出:

当方法调用中的参数格式与相应的形式参数类型的格式不匹配时,抛出FormatException.例如,如果方法指定一个String由两个带嵌入句点的数字组成的参数,则将只包含两位数的相应字符串参数传递给该方法将导致抛出FormatException.

听起来像是ArgumentException我的一个或派生课程的场景.

所有这些意味着您无法FormatException在较大的ArgumentException异常系列下处理,也无法识别导致异常的参数.

这个看似不合时宜的例外是否有任何理由存在?

Meh*_*ari 14

FormatException当方法的形式参数无效时,不一定抛出.如果该方法消耗外部资源并且来自外部资源的数据格式不合适,也会发生这种情况.

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

您从MSDN文章中引用的描述比FormatException实际更具限制性,应该澄清.


Kev*_*Won 6

这有点嗤之以鼻:但是CLR中的 Richter 通过C#(第432页)表明,可能是因为异常类层次结构在.NET中没有很好地实现:

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

但是,......这条规则并未得到很好的遵循; 一些异常是立即派生自Exception(IsolatedStorageException),一些CLR引发的异常是派生形式ApplicationException......所以它是一个大混乱,结果是SystemExceptionApplicationException类型没有任何特殊意义.此时,Microsoft希望将它们从异常类层次结构中删除,但它们不能,因为它会破坏已引用这些类型的任何代码.

这不完全是你的查询的答案,但我认为它是相关的,因为我认为它表明没有一个很好的理由为什么一些异常衍生物继承他们的方式.不幸的是,Exception类的继承并没有经过深思熟虑而且它有点混乱.