从System.ArgumentException派生类是否可行?

40
如果我有一个检查其参数有效性的方法,那么从System.ArgumentException派生自定义异常后抛出是否可以?我之所以问这个问题是因为ArgumentException本身就是从System.SystemException派生而来,关于应用程序是否应该派生自SystemException的指南存在冲突。(尽管间接地从ArgumentException派生仍等同于从SystemException派生。)
我看到很多指南都说不要从ApplicationException派生,而是从Exception派生,我对此很满意。但我不确定的是是否也可以从SystemException派生。
如果我不应该从SystemException派生,那么我的"无效参数"异常类应该从哪里派生呢?

2
如果提供的参数无效,则应该抛出ArgumentException异常。您可以完全从中派生以在这种情况下使用。从SystemException派生没有意义,但是如果参数为空,则可以抛出ArgumentNullException;如果超出了可接受的范围,则可以抛出ArgumentOutOfRangeException。它们都派生自ArgumentException。因此,在这种情况下抛出一个不派生自ArgumentException的自定义异常是我认为您不应该做的事情。所以我赞同Botz3000的答案。 - Şafak Gür
5个回答

41

7

继承自System.ArgumentException的一个好处是,catch(System.ArgumentException)块可以处理你的自定义异常类型以及System.ArgumentException。这可能符合你的预期,也可能不符合。


5

如果你想推导你的“无效参数”异常,并且它们没有其他意义,那么ArgumentException听起来是一个合理的选择:

当调用方法时,如果传递的至少一个参数不符合被调用方法的参数规范,则会引发ArgumentException--MSDN


4
在 .Net 中,异常的最初概念是基类库 (例如 System 组件) 中会抛出派生自 System.Exception 的异常,并建议所有自定义异常都继承自 System.ApplicationException,以区分 BCL 异常和应用程序异常。然而,微软已经反悔了这个想法,现在建议所有异常都继承自 System.Exception。
我的建议是从框架中最低的 Exception 类继承,这是有意义的。
如果你的异常除了指出问题参数之外还表示特定含义(例如 ArgumentNullException 和 ArgumentOutOfRangeException),则可以创建自定义异常,否则就只需使用 ArgumentException 并提供有意义的异常消息即可。

用户异常应该从ApplicationException继承,而不是SystemException。 - Nate C-K
很好,我在那篇帖子里经常打错exception这个词,我会纠正的! - Trevor Pilley

2

如果您100%重用ArgumentException属性并添加一些额外的功能,那就可以了。但是,如果您只因为它的名称而重用它,那就不行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接