Rob*_*ert 490 error-handling null exception
我有一个方法,如果找到它,它应该返回一个对象.
如果找不到,我应该:
Ken*_*Ken 472
如果您总是希望找到一个值,则抛出异常(如果缺少).例外意味着存在问题.
如果该值可能丢失或存在且两者都对应用程序逻辑有效,则返回null.
更重要的是:你在代码中的其他地方做了什么?一致性很重要.
Car*_*nke 96
如果确实是错误,则仅抛出异常.如果对象的预期行为不存在,则返回null.
否则这是一个偏好的问题.
Mat*_*ino 66
作为一般规则,如果方法应始终返回一个对象,那么请使用异常.如果您预计偶尔会出现空值并希望以某种方式处理它,请使用null.
无论你做什么,我都强烈反对第三种选择:返回一个写着"WTF"的字符串.
Kev*_*ale 50
如果null从不指示错误,则返回null.
如果null始终是错误,则抛出异常.
如果null有时是异常,那么编写两个例程.一个例程抛出异常,另一个是布尔测试例程,它返回输出参数中的对象,如果找不到对象,则例程返回false.
很难滥用Try例程.忘记检查null是很容易的.
所以当null是你刚才写的错误时
object o = FindObject();
Run Code Online (Sandbox Code Playgroud)
当null不是错误时,您可以编写类似的代码
if (TryFindObject(out object o)
// Do something with o
else
// o was not found
Run Code Online (Sandbox Code Playgroud)
Len*_*mel 25
我只是想概括之前提到的选项,抛出一些新的:
或者您可以组合这些选项:
提供几个重载版本的getter,这样调用者就可以决定走哪条路.在大多数情况下,只有第一个具有搜索算法的实现,而其他的只是包围第一个:
Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);
Run Code Online (Sandbox Code Playgroud)
即使您选择只提供一个实现,您也可能希望使用这样的命名约定来阐明您的合同,如果您决定添加其他实现,它也会有所帮助.
你不应该过度使用它,但它可能是有帮助的,特别是在编写一个帮助程序类时,你将在数百个不同的应用程序中使用它们,它们具有许多不同的错误处理约定.
pml*_*que 18
使用null对象模式或抛出异常.
Cor*_*erg 11
这取决于您的语言和代码是否促进:LBYL(在您跳跃之前看)或EAFP(比请求更容易请求宽恕)
LBYL说你应该检查值(所以返回null)
EAFP说只是尝试操作并查看它是否失败(抛出异常)
虽然我同意上述..异常应该用于异常/错误条件,并且在使用检查时返回null是最好的.
EAFP与Python中的LBYL:
http://mail.python.org/pipermail/python-list/2003-May/205182.html
(Web Archive)
Ala*_*anR 11
只要问自己:"这是一个特殊情况,没有找到对象"?如果预计会在程序的正常过程中发生,则可能不应该引发异常(因为它不是异常行为).
简短版本:使用异常来处理异常行为,而不是处理程序中的正常控制流.
-Alan.
小智 11
抛出异常的优点:
有关示例的更多说明,请参阅:http://metatations.com/2011/11/17/returning-null-vs-throwing-an-exception/
例外与合同设计有关.
对象的接口实际上是两个对象之间的契约,调用者必须满足契约,否则接收者可能会因异常而失败.有两种可能的合同
1)所有输入方法都有效,在这种情况下,必须在找不到对象时返回null.
2)只有一些输入有效,即导致找到对象的输入.在这种情况下,您必须提供第二种方法,允许调用者确定其输入是否正确.例如
is_present(key)
find(key) throws Exception
Run Code Online (Sandbox Code Playgroud)
IF和ONLY如果你提供第二个合同的两种方法,你可以抛出一个例外,没有找到任何东西!
| 归档时间: |
|
| 查看次数: |
142558 次 |
| 最近记录: |