要为无法识别的ID参数抛出什么异常类型?

时间:2010-04-14 16:16:46

标签: c# .net exception

ITool GetTool(Guid tool)
{
    if (tool == Hammer.Id)
        return new Hammer();
    else if (tool == Drill.Id)
        return new Drill();

    else
        throw new ....?
}

什么是最合适的异常类型? NotSupportedException是我发现的最接近但我不认为这是正确的。

6 个答案:

答案 0 :(得分:7)

我会选择一个简单的ArgumentExceptionArgumentOutOfRangeException

对后者的描述听起来恰到好处:

  

当抛出异常时   参数的值在...之外   允许的值范围   通过调用的方法。

如果你认为一组允许值是一个“范围”,那就没关系了。我想说。

你肯定要在这里使用Guid吗?您可以使用有效工具的枚举吗?

编辑:回答创建自己的例外的建议:它会提供什么价值?你真的想抓住那个特定的例外吗?如果没有,哪里有好处?如果您将捕获该异常,那么在调用该方法之前,您是否应该验证您的参数?我发现创建一个自定义异常很少,除非真的没有什么适合。

答案 1 :(得分:2)

如果你找不到真正合适的,你可以随时创建自己的例外:)

编辑:我认为ArgumentException是一个非常接近的。

答案 2 :(得分:2)

通过消除过程:

  • 制作自己的暗示异常是可捕获的并且可以处理。它永远不会被捕获,如果不重新编译就无法从错误中恢复。
  • NotSupportedException意味着您的代码因不支持所请求的工具而出错。 Guid不太可能拥有数万亿无效的工具值。
  • ArgumentOutOfRange意味着Guid太小或太大。没有意义,他们没有范围。
  • ApplicationException现在被认为不是最佳实践,并且不够具体。

ArgumentException(“请求未知工具”)

答案 3 :(得分:0)

乍一看,我会说ArgumentException

答案 4 :(得分:0)

您应该使用ArgumentException,因为问题是Guid参数传递的“工具”不符合此方法的任何受支持的类型。错误消息应该如此说明。

在我看来,这个错误的原因很难说,这个案子的尴尬本质。这种方法似乎有点像工厂,但对于可能实现此接口的特定类型。 Hammer不应该实现自己的GetTool并且总是返回一个Hammer类型的ITool?否则你会得到你所拥有的东西,这是试图预期所有类型可能会通过什么。如果类型改变或添加新类型,那似乎注定要遇到麻烦。然后onus是在原始方法上支持新类型,而不是支持这种通用接口方法的新类型。这不是“可插拔”类的目标,这是什么接口鼓励?

答案 5 :(得分:0)

如果你不需要它,我会说ArgumentException。如果你确实需要这种方法由于各种原因抛出很多异常而且已经“耗尽”,那就创建自己的。

它不一定要特定于此方法,只需要为您要定位的域表达正确的概念。例如,如果您还有与Nails和Screws相关的对象和方法,则可能会创建一个例外,例如DIYThingNotFound。

只是去一点offtopic(可能你已经知道的东西) - 如果你不能满足请求就要抛出异常,请确保你提供一种先检查的方法(例如,doToolExist(Guid工具) ))。