ITool GetTool(Guid tool)
{
if (tool == Hammer.Id)
return new Hammer();
else if (tool == Drill.Id)
return new Drill();
else
throw new ....?
}
什么是最合适的异常类型? NotSupportedException是我发现的最接近但我不认为这是正确的。
答案 0 :(得分:7)
我会选择一个简单的ArgumentException
或ArgumentOutOfRangeException
。
对后者的描述听起来恰到好处:
当抛出异常时 参数的值在...之外 允许的值范围 通过调用的方法。
如果你认为一组允许值是一个“范围”,那就没关系了。我想说。
你肯定要在这里使用Guid吗?您可以使用有效工具的枚举吗?
编辑:回答创建自己的例外的建议:它会提供什么价值?你真的想抓住那个特定的例外吗?如果没有,哪里有好处?如果您将捕获该异常,那么在调用该方法之前,您是否应该验证您的参数?我发现创建一个自定义异常很少,除非真的没有什么适合。
答案 1 :(得分:2)
如果你找不到真正合适的,你可以随时创建自己的例外:)
编辑:我认为ArgumentException是一个非常接近的。
答案 2 :(得分:2)
通过消除过程:
ArgumentException(“请求未知工具”)
答案 3 :(得分:0)
乍一看,我会说ArgumentException
。
答案 4 :(得分:0)
您应该使用ArgumentException,因为问题是Guid参数传递的“工具”不符合此方法的任何受支持的类型。错误消息应该如此说明。
在我看来,这个错误的原因很难说,这个案子的尴尬本质。这种方法似乎有点像工厂,但对于可能实现此接口的特定类型。 Hammer不应该实现自己的GetTool并且总是返回一个Hammer类型的ITool?否则你会得到你所拥有的东西,这是试图预期所有类型可能会通过什么。如果类型改变或添加新类型,那似乎注定要遇到麻烦。然后onus是在原始方法上支持新类型,而不是支持这种通用接口方法的新类型。这不是“可插拔”类的目标,这是什么接口鼓励?
答案 5 :(得分:0)
如果你不需要它,我会说ArgumentException。如果你确实需要这种方法由于各种原因抛出很多异常而且已经“耗尽”,那就创建自己的。
它不一定要特定于此方法,只需要为您要定位的域表达正确的概念。例如,如果您还有与Nails和Screws相关的对象和方法,则可能会创建一个例外,例如DIYThingNotFound。
只是去一点offtopic(可能你已经知道的东西) - 如果你不能满足请求就要抛出异常,请确保你提供一种先检查的方法(例如,doToolExist(Guid工具) ))。