Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于无法识别的ID参数,要引发什么异常类型?_C#_.net_Exception - Fatal编程技术网

C# 对于无法识别的ID参数,要引发什么异常类型?

C# 对于无法识别的ID参数,要引发什么异常类型?,c#,.net,exception,C#,.net,Exception,在这里抛出的最合适的异常类型是什么?NotSupportedException是我发现的最接近的异常,但我认为这并不完全正确。如果你找不到真正正确的异常,你可以创建自己的异常:) 编辑:我认为ArgumentException很接近。我会选择一个简单的或 对后者的描述在我听来恰到好处: 当 参数的值不在 定义的允许值范围 通过调用的方法 如果你认为一组允许值是一个“范围”,那就好了,我会说。 您一定要在这里使用Guid吗?您可以使用有效工具的枚举吗 编辑:回答创建您自己的异常的建议:这将提供什么

在这里抛出的最合适的异常类型是什么?NotSupportedException是我发现的最接近的异常,但我认为这并不完全正确。

如果你找不到真正正确的异常,你可以创建自己的异常:)

编辑:我认为ArgumentException很接近。

我会选择一个简单的或

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

当 参数的值不在 定义的允许值范围 通过调用的方法

如果你认为一组允许值是一个“范围”,那就好了,我会说。 您一定要在这里使用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 ....?
}