处理空值的最佳做法是什么?

时间:2011-04-07 20:10:36

标签: exception exception-handling null

我有一个应用程序,它在其中一个方法中将DNS主机名解析为IP问题是,如果执行此解析的方法传递为null,那么最好的做法是什么?有几个选择:

-Throw ArgumentNullException(不应该捕获编程错误,除了顶部的全局错误处理程序)。

- 返回另一个主机名(例如,如果一个方法接受一个人的名字作为参数,并且该参数为null,我可以返回“person”)。如果这是不可能的,即网络中只有一个我可以为其提供主机名的主机,则抛出异常是有意义的。也许比使用另一个主机名更好,这可能会惹恼最终用户。

什么更好?

由于

6 个答案:

答案 0 :(得分:3)

抛出异常。在接收到您认为不可接受的输入的情况下,您的方法永远不应返回看似有效的值。它应该返回null或抛出异常(更好的路由)。这样做的原因是,即使你想出了一些“错误代码字符串”,有人也不会阅读你的文档,或者你会忘记以后再碰到墙,想知道为什么它应该失败时没有失败。

答案 1 :(得分:1)

将其视为服务。使用该服务的人将想知道是否传入了垃圾值,以便可以快速适当地处理它。否则你会得到垃圾,甚至不知道出了什么问题。

因此:抛出异常。

答案 2 :(得分:0)

我想说抛出异常然后让顶级处理程序向用户打印一条适当的消息。返回备用主机名可能不是大多数用户所期望的。

答案 3 :(得分:0)

在一个应用程序中,我一直在研究这种情况是这样的:

Is the Hostname available? Yes, return that.
If the Host IP Address available? Yes, return that.
Else return `Unknown`.

在你的情况下(从它的声音,使用.NET),如果它是你的应用程序的致命错误,它应该只是抛出它从堆栈中得到的任何错误。如果你确实想要返回的东西代替主机名,那么捕获异常并恢复是正确的。

一个'boneheaded'异常,其中有人传入null,应该抛出堆栈而不会被捕获,因为这是指示性或错误的代码,应该在找到时修复。

答案 4 :(得分:0)

第三个选项可能是返回相应的空IP地址。这允许调用者基于返回值做出关于做什么的决定。 (据推测,您已经为没有相应地址的主机名返回了某种空IP地址。)

答案 5 :(得分:0)

正确的方法是使用“trier / doer”模式:使用“trier”方法返回可能有效或可能不是有效地址的方式(以调用者可以判断地址是否有效的方式) ),以及一个“doer”方法,如果不能返回有效地址或抛出异常。准备处理无法获得有效地址的代码应使用trier方法;没有为这种可能性做好准备的代码应该使用“doer”方法。 trier / doer模式通常通过让trier和doer方法包装第三种方法来实现,该方法包括一个参数,指示在发生故障时该怎么做。