40

如果我有一个检查其参数有效性的方法,是否可以抛出我自己的自定义异常System.ArgumentException?我之所以问,是因为ArgumentException它本身源自,System.SystemException并且我看到关于应用程序是否应源自SystemException. (尽管间接地,派生自ArgumentException仍等于派生自SystemException。)

我看到很多指导方针说不要从 Exception 派生ApplicationException,而是从 Exception 派生。我对此很满意。我不确定是否也可以从 SystemException 派生。

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

4

5 回答 5

41

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

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

所以我会说没关系,甚至推荐。

于 2012-10-12T11:17:10.427 回答
7

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

于 2012-10-12T11:14:28.450 回答
5

如果您想得出“无效参数”异常并且它们没有除此之外的含义,那么ArgumentException听起来像是一个合理的候选者:

当调用方法并且至少有一个传递的参数不符合被调用方法的参数规范时,将引发ArgumentException 。--MSDN

于 2012-10-12T11:11:44.077 回答
4

.Net 中异常背后的最初想法是,基类库(例如系统程序集)中的异常会引发异常,这些异常源自System.Exception并建议所有自定义异常都继承自System.ApplicationException以区分 BCL 异常和应用程序异常,但是 Microsoft 已经回溯了这一点想法,现在建议所有异常都继承自System.Exception.

Exception我的建议是从框架中有意义的最低类继承。

如果您的异常意味着除此参数存在问题之外的特定内容,例如,该类型可以为异常添加语义(就像ArgumentNullExceptionArgumentOutOfRangeException做一样)然后制作一个自定义的,如果不是那么只需使用ArgumentException并提供有意义的异常消息。

于 2012-10-12T11:16:17.167 回答
2

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

于 2012-10-12T11:12:31.033 回答