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

问题描述 投票:2回答:6

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

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

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

什么是更好的?

谢谢

exception exception-handling null
6个回答
3
投票

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


1
投票

将其视为服务。 正在使用该服务的人们将想知道是否传递了垃圾值,以便可以快速,适当地对其进行处理。 否则,您将得到垃圾,甚至不知道有什么问题。

因此:抛出异常。


0
投票

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


0
投票

在一个应用程序中,我处理过的情况是这样的:

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

但是,在您的情况下(从它的声音来看,使用.NET),如果这对于您的应用程序是致命的错误,则应仅抛出它堆积的任何错误。 如果您确实有想要代替主机名返回的内容,那么捕获异常并进行恢复将是正确的。

有人传入null的“骨头”异常应该抛出堆栈而不是被捕获,因为这是指示性代码或错误代码,应在发现时进行修复。


0
投票

第三种选择可能是返回相应的空IP地址。 这使调用者可以根据返回值来决定要做什么。 (大概,对于没有相应地址的主机名,您已经返回了某种空IP地址。)


0
投票

正确的方法是使用“ trier / doer”模式:拥有一个“ trier”方法,该方法将返回可能是或不是有效地址的内容(以一种方式,使调用者可以分辨出该地址是否有效),以及一个“ doer”方法,该方法将返回有效地址或将其抛出异常。 准备处理无法获得有效地址的代码应使用trier方法; 没有为此准备的代码应使用“执行程序”方法。 特里尔/杜尔模式通常是通过使特里尔和杜尔方法都包装第三种方法来实现的,该方法包括一个参数,该参数指示失败时的处理方式。

© www.soinside.com 2019 - 2024. All rights reserved.