可以从System.ArgumentException派生吗?

时间:2012-10-12 11:05:15

标签: c# exception

如果我有一个方法来检查其参数的有效性,是否可以抛出我自己的System.ArgumentException派生的自定义异常?我问,因为ArgumentException本身来自System.SystemException,我看到有关应用程序是否应来自SystemException的指导方针存在冲突。 (虽然间接地,从ArgumentException得出仍然等于从SystemException得出。)

我看到许多指南说不从ApplicationException派生,而是从Exception派生而来。我很高兴。我不确定的是,是否也可以从SystemException派生出来。

如果我不应该从SystemException派生,那么我应该从我的"invalid argument"异常类派生什么?

5 个答案:

答案 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类继承。

如果您的例外意味着除了此参数存在问题之外的特定事项,例如该类型可以向异常添加语义(就像ArgumentNullExceptionArgumentOutOfRangeException那样)然后创建一个自定义语句,如果没有,那么只需使用ArgumentException并提供有意义的异常消息。

答案 4 :(得分:2)

如果您100%重用ArgumentException属性并添加一些额外的功能,那就没问题。但是,当你因为它的名字而只重用它时,就不行了。