转载

返回null还是抛出Exception

我自己在写代码的时候也经常会写return null,但仔细想想这真的好吗?

        public UserGetUser(string userName, string password)         {             if ( /*for some reason*/)                 return null;                          return new User();         } 

这样写有什么问题呢?如果方法的使用者并不知道(或者对null的情况没有进行处理)在何种条件下会得到null,从而导致臭名昭著的NullReferenceException异常。而且这个Exception在调试过程中还是不可见的(因为只有当你得到null时这个Exception才会出现)。

如果你直接抛出异常,那么结果基本是一致的。

那什么情况下返回null,什么情况抛出异常呢?在StackOverflow上有一个讨论: Should a retrieval method return ‘null’ or throw an exception when it can’t produce the return value? 觉得这里的结论还是比较一致的:如果返回null是一个正常行为,则返回null,如果是一个错误,则抛出Exception。

还有一种更好的实践,在linq中有两个方法FirstOrDefault()和LastOrDefault(),会给人一种暗示,那就是Default是什么东东,空的?还是null。

所以如果非要返回null,上面的函数可以重命名为GetUserOrNull(string userName, string password)。

最后总结一下:

1、如果返回null是一个正常行为,则返回null。但在命名时最好给用户以提示,例如GetUserOrNull(string userName, string password)这样的函数名。

2、如果是错误,则抛出Exception。

原文  http://tson.com/null-or-exception/
正文到此结束
Loading...