【问题标题】:Abstract class: Which exception should I throw when child classes aren't implemented correctly?抽象类:当子类没有正确实现时,我应该抛出哪个异常?
【发布时间】:2012-04-07 09:32:05
【问题描述】:

假设我有一个抽象类:

abstract class MyAbstract
{
    protected abstract object ImplementMePlz();

    public object DoSomething()
    {
        // Some logic here

        var result = ImplementMePlz();
        if (result == null)
            throw new YourChildClassIsStupidException("ImplementMePlz() should never return null.");

        return result;
    }
}

在这种情况下我应该抛出什么样的异常? .NET 框架中是否有指定的异常,或者我应该创建自己的自定义异常?

【问题讨论】:

  • 我会抛出 ArgumentNullException 但我不确定这是否完全适合。
  • YourChildClassIsStupidException 异常有什么问题?

标签: .net exception inheritance abstract-class


【解决方案1】:

这取决于您的子类返回 null 的原因。在子类中抛出异常可能更有意义,因为它可以更好地了解为什么它返回 null 并且可以产生更多信息的异常。

如果您无法控制子类,那么您应该做以下两件事之一。

  1. 您可以从 null 返回中推断出一些信息。您应该创建一个传递该知识的异常,例如API 规定,如果其中一个输入无效,则应返回 null,抛出 InvalidArgumentExpection。

  2. 你只知道它不应该为空,如果是这种情况,抛出 ArgumentNull 异常或类似的东西

【讨论】:

  • 问题是我不一定会成为编写子类的人。如果我正在编写 API,任何人都可以编写子类,并且他们需要知道返回 null 根本行不通。基本上,例外是为了开发者的利益,而不是用户的利益。
【解决方案2】:

“.NET 框架中是否存在指定异常?”问题的答案是“否”——没有这样的例外。

如果我是你,我会创建一个自定义异常。

【讨论】:

    【解决方案3】:

    您应该创建自己的异常类。我所知道的处理这种情况的框架也不例外。为什么?我认为框架不需要这个例外。

    另外,我建议首先使用Code Contracts 来防止异常。

    【讨论】:

    • 是的,但您必须担心派生类中的内容没有正确实现。
    • 啊,更新答案以反映这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多