如果我有一个方法来检查其参数的有效性,是否可以抛出我自己的System.ArgumentException
派生的自定义异常?我问,因为ArgumentException
本身来自System.SystemException
,我看到有关应用程序是否应来自SystemException
的指导方针存在冲突。 (虽然间接地,从ArgumentException
得出仍然等于从SystemException
得出。)
我看到许多指南说不从ApplicationException
派生,而是从Exception派生而来。我很高兴。我不确定的是,是否也可以从SystemException派生出来。
如果我不应该从SystemException
派生,那么我应该从我的"invalid argument"
异常类派生什么?
答案 0 :(得分:40)
MSDN page about Best Practices for Handling Exceptions说
抛出ArgumentException或从ArgumentException派生的类 如果传递了无效参数。
所以我会说它没问题,甚至推荐。
答案 1 :(得分:7)
从System.ArgumentException派生的一个好处是catch(System.ArgumentException)
块将能够处理您的自定义异常类型以及System.ArgumentException
。这可能是也可能不是你想要的。
答案 2 :(得分:5)
如果你想得出你的“无效论证”例外而且除此之外没有意义,那么ArgumentException
听起来像是一个合理的候选人:
调用方法并且至少有一个传递的参数不符合被调用方法的参数规范时,抛出ArgumentException 。 --MSDN
答案 3 :(得分:4)
.Net中异常背后的原始想法是基类库中的异常(例如系统程序集)会抛出派生自System.Exception
的异常,并建议所有自定义异常都从System.ApplicationException
继承到区分BCL异常和应用程序异常,但Microsoft已经回避了这个想法,现在建议所有异常都继承自System.Exception
。
我的建议是从有意义的框架中的最低Exception
类继承。
如果您的例外意味着除了此参数存在问题之外的特定事项,例如该类型可以向异常添加语义(就像ArgumentNullException
和ArgumentOutOfRangeException
那样)然后创建一个自定义语句,如果没有,那么只需使用ArgumentException
并提供有意义的异常消息。
答案 4 :(得分:2)
如果您100%重用ArgumentException属性并添加一些额外的功能,那就没问题。但是,当你因为它的名字而只重用它时,就不行了。