C# 对于无法识别的ID参数,要引发什么异常类型?
在这里抛出的最合适的异常类型是什么?NotSupportedException是我发现的最接近的异常,但我认为这并不完全正确。如果你找不到真正正确的异常,你可以创建自己的异常:) 编辑:我认为ArgumentException很接近。我会选择一个简单的或 对后者的描述在我听来恰到好处: 当 参数的值不在 定义的允许值范围 通过调用的方法C# 对于无法识别的ID参数,要引发什么异常类型?,c#,.net,exception,C#,.net,Exception,在这里抛出的最合适的异常类型是什么?NotSupportedException是我发现的最接近的异常,但我认为这并不完全正确。如果你找不到真正正确的异常,你可以创建自己的异常:) 编辑:我认为ArgumentException很接近。我会选择一个简单的或 对后者的描述在我听来恰到好处: 当 参数的值不在 定义的允许值范围 通过调用的方法 如果你认为一组允许值是一个“范围”,那就好了,我会说。 您一定要在这里使用Guid吗?您可以使用有效工具的枚举吗 编辑:回答创建您自己的异常的建议:这将提供什么
如果你认为一组允许值是一个“范围”,那就好了,我会说。 您一定要在这里使用Guid吗?您可以使用有效工具的枚举吗
编辑:回答创建您自己的异常的建议:这将提供什么价值?您真的想捕获那个特定的异常吗?如果没有,好处在哪里?如果要捕获该异常,那么在调用该方法之前是否应该验证参数?我发现创建自定义异常几乎不值得,除非真的没有合适的异常。乍一看,我认为应该使用
ArgumentException
,因为问题是传递的Guid参数“tool”不符合此方法支持的任何类型。错误消息应如此声明
不过,在我看来,这件事让你感到厌烦,而且很难说清楚的原因是这件事的尴尬性质。此方法的工作方式似乎有点像工厂,但适用于可能实现此接口的特定类型。Hammer不应该实现自己的GetTool并始终返回Hammer类型的ITool吗?否则,你会得到你在这里所拥有的,这是一种尝试,以预测所有类型可能会通过。如果类型发生变化或添加新类型,这似乎注定会带来麻烦。然后,由原来的方法来支持新的类型,而不是支持这种公共接口方法的新类型。这不是“可插拔”类的目标吗?这是接口所鼓励的吗?如果您不需要它来做任何其他事情,我会说它是例外。如果出于各种原因确实需要此方法抛出大量异常,并且“用完”,请创建自己的异常 它不必特定于此方法,它只需要为目标域表达正确的概念。例如,如果您还有与钉子和螺钉相关的对象和方法,则可能会创建一个异常,例如DIYThingNotFound。
还有一点离题(可能是你已经知道的)——如果你想在请求无法满足时抛出异常,请确保你提供了一种先检查的方法(例如doesToolExist(Guid工具))。通过消除过程:
- 创建自己的异常意味着异常是可捕获的,并且可以处理。它永远不会被捕获,如果不重新编译,就无法从错误中恢复
- NotSupportedException意味着您的代码因不支持请求的工具而出错。不太可能,Guid有数以万亿计的无效工具值
- ArgumentOutOfRange表示Guid太小或太大。没有意义,他们没有射程
- ApplicationException现在被认为不是最佳实践,也不够具体
ArgumentException(“请求使用未知工具”)编写您自己的。。。类似于ToolNotFoundException的东西我确信你的意思是==这里--“如果(tool=Drill.Id)”在没有发明
ToolIDNotRecognizedException
的情况下,我可能会选择ArgumentOutOfRangeException
+1.ArgumentOutOfRangeException取决于“范围”的含义。例如,“有广泛的可用选项”意味着有许多特定的选项,而不是它们形成某种有序的数学范围。严格地说,它更像是一个集合而不是一个范围,但是意图是恰当的,依我看。这不是框架使用它的方式,它检查的范围没有漏洞。我同意这个答案,因为我已经考虑了ArgumentOutOfRange,并且出于你所说的原因,我对它不太满意。
ITool GetTool(Guid tool)
{
if (tool == Hammer.Id)
return new Hammer();
else if (tool == Drill.Id)
return new Drill();
else
throw new ....?
}