可以从System.ArgumentException派生吗?

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

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

如果我不应该从SystemException派生,那么我应该从哪个派生我的"invalid argument"exception类?

关于处理exception的最佳实践的MSDN页面说

如果传递了无效参数,则抛出ArgumentException或从ArgumentException派生的类。

所以我会说这是可以的,甚至build议。

从System.ArgumentException派生的一个好处是, catch(System.ArgumentException)块将能够处理您的自定义exceptiontypes以及System.ArgumentException 。 这可能是也可能不是你想要的。

如果你想得到你的“无效参数”exception,并且没有超出这个意义的含义,那么ArgumentException听起来像是一个合理的候选:

当一个方法被调用并且至less有一个传入的参数不符合被调用方法的参数说明时,抛出ArgumentExceptionexception。 –MSDN

.Net中的例外原意是基类库(例如系统程序集)中的exception会抛出从System.Exception派生的exception,并build议所有自定义exceptioninheritance自System.ApplicationException以区分BCLexception和应用程序exception但是微软已经回顾了这个想法,现在build议所有的exceptioninheritance自System.Exception

我的build议是从框架中最低的Exception类inheritance,这是合理的。

如果你的exception是指这个参数以外的东西,比如这个types可以把exception添加到exception(就像ArgumentNullExceptionArgumentOutOfRangeException一样),然后创build一个自定义的exception,如果不是的话就使用ArgumentException并提供一个有意义的exception信息。

如果您100%重复使用ArgumentException属性并添加一些额外的function,那就没关系了。 但是,当你只是因为它的名字而重用它时,它就不好。