【问题标题】:Is it ok to derive from System.ArgumentException?从 System.ArgumentException 派生可以吗?
【发布时间】:2012-10-12 11:05:15
【问题描述】:

如果我有一个方法可以检查其参数的有效性,是否可以抛出我自己从System.ArgumentException 派生的自定义异常?我之所以问是因为ArgumentException 本身是从System.SystemException 派生的,而且我看到有关应用程序是否应从SystemException 派生的相互矛盾的指导方针。 (虽然是间接的,从ArgumentException 派生仍然等同于从SystemException 派生。)

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

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

【问题讨论】:

  • 如果提供的参数无效,该方法应抛出ArgumentException。您可以完美地从中派生出在这种情况下使用。从SystemException 派生没有意义,但如果参数为空,则抛出ArgumentNullException,如果参数超出可接受范围,则抛出ArgumentOutOfRangeException。它们都来自ArgumentException。因此,在这种情况下抛出一个不是从ArgumentException 派生的自定义异常是恕我直言,您不应该 做的事情。所以我会选择 Botz3000 的答案。

标签: c# exception


【解决方案1】:

MSDN page about Best Practices for Handling Exceptions

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      ArgumentException 在调用方法并且至少有一个传递的参数不符合被调用方法的参数规范时抛出。 --MSDN

      【讨论】:

        【解决方案4】:

        .Net 中异常背后的最初想法是基类库(例如 System 程序集)中的异常会抛出派生自 System.Exception 的异常,并建议所有自定义异常都继承自 System.ApplicationException 以区分 BCL 异常和应用程序异常,但是 Microsoft 已经放弃了这个想法,现在建议所有异常都继承自 System.Exception

        我的建议是继承框架中最底层的 Exception 类。

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

        【讨论】:

        • 用户异常应该来自 ApplicationException,而不是 SystemException。
        • 不错,我在那篇文章中输入异常的频率太高了,我会改正的!
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2015-05-10
          • 1970-01-01
          • 2012-11-22
          • 1970-01-01
          • 1970-01-01
          • 2014-04-30
          • 2017-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多