Luc*_*nes 11 .net c# exception
是否在.NET Framework中定义了我不应该在我自己的代码中引入的异常,或者这是不好的做法?我应该自己写吗?
Jar*_*Par 22
您不应抛出由于用户错误而由CLR自动抛出的任何异常.例如
这样做的原因是为调用API的人造成了混乱.用户应该能够区分API主动抛出的异常和未主动抛出的异常(由CLR抛出).
原因是主动抛出异常通常表示API中的已知状态.如果我调用一个API并抛出一个ArgumentException,我有理由期望给定的对象处于良好的状态.它认识到一种潜在的不良情况并积极地对其进行说明.另一方面,如果它抛出NullRefrenceException,则表明API遇到未知错误,现在处于不可靠状态.
另一个较小的原因是,当用户代码抛出而不是CLR时,这些异常的行为会有所不同.例如,如果用户代码抛出,则可能捕获StackOverflowException,但如果CLR抛出则不会.
编辑回应迈克尔的评论
您也不应该直接抛出Exception,ApplicationException或SystemException.这些异常类型过于笼统,无法为调用API的代码提供有意义的信息.如果是,您可以在message参数中添加非常具描述性的消息.但是根据消息捕获异常并不是直接或可维护的.根据类型捕获它会好得多.
关于这个主题的FxCop规则:http://msdn.microsoft.com/en-us/library/ms182338( VS.80).aspx
框架中的大多数异常类都不是为了重用,因为它们通常用于表示某些特定于框架的错误.与@JaredPar提到的那些一样,框架使用它们来指示框架中的某些状态.
在框架中有几十个,也许几百个例外,因此IMO列出我们应该使用的那些更有用.在我的头脑中,这些是我积极使用的:
对于用户代码中的其他错误条件,最佳做法是创建自己的异常类.