从尝试返回 null 的方法.抓住
本文关键字:方法 抓住 null 返回 | 更新日期: 2023-09-27 18:35:56
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
if(itemCol != null)
return itemCol;
else
return null;
}
catch(Exception ex)
{
LogException(ex);
return null;
}
}
此方法必须返回 null(而不是空列表) - 无论是否捕获异常。以上有效 - 但有更好的方法吗?
我必须首先说这是一件可怕的事情,吞下异常是可怕的!不要这样做!它会困扰你并使调试非常非常困难,更糟糕的是,由于异常而返回 null - null 通常最终会抛出一个 NullReferenceException,这将比被吞噬的异常更难调试(即使它被记录),但既然你问:
public SPListItemCollection GetACollection()
{
SPListItemCollection itemCol = null;
try
{
//Method to get an item collection from somewhere
}
catch(Exception ex)
{
LogException(ex);
}
return itemCol;
}
if(itemCol != null)
return itemCol;
else
return null;
简化为
return itemCol;
因为如果itemCol == null
那么返回itemCol
已经返回null
.没有理由对这种行为进行特殊处理。
如果要通过 null
替换空集合,则需要使用如下内容:
if((itemCol != null) && itemCol.Any())
return itemCol;
else
return null;
一些设计建议:
- 不鼓励吞咽例外。您应该只捕获一些您知道如何处理的特定异常
- 空集合通常比
null
更好处理。
从不喜欢具有多出口点的方法,
在您的捕获集项中,Col 为 null,在尝试/捕获返回项的外部
try
{
// whatever
if(itemCol.Count == 0) itemCol = null;
}
catch(Exception x)
{
LogException(x);
itemCol = null;
}
return itemCol;
你提到你目前的实现是有效的。我假设用于获取项目集合的方法返回具有 1 个或多个项目的集合,或者返回 null 或抛出异常。如果这是真的,这将是一种选择。
public SPListItemCollection GetACollection()
{
SPListItemCollection itemCol = null;
try
{
itemCol = //Method to get an item collection from somewhere
}
catch(Exception e)
{
LogException(e);
}
return itemCol;
}
要检查集合是否为空的天气,Any()
方法很有用,主要是如果您没有列表,而是一般的 IEnumerables。如果你只是想摆脱重复的return null;
,你可以很容易地做到:
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
if(itemCol.Any())
return itemCol;
}
catch(Exception ex)
{
LogException(ex);
}
return null;
}
您还可以附加一个
finally
{
// Stuff that always needs to be done.
}
紧跟在catch
的右括号之后。
很好了,imo,我也会删除最后一个else
,像这样:
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
if(itemCol != null)
return itemCol;
//Some if/else code here presumably...
//NO ELSE HERE...
return null;
}
catch(Exception ex)
{
LogException(ex);
return null;
}
}
你不需要if-else
块,因为如果对象为 null,你已经返回 null:
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
return itemCol;
}
catch(Exception ex)
{
LogException(ex);
return null;
}
}
这个怎么样?如果您的规格显示:
必须返回空值(不是空列表)
如果集合不是 null,而是空,则当前实现将返回一个空集合。除非您依赖该方法来处理它。
这照顾了...
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
if(itemCol != null && itemCol.Count == 0)
return itemCol;
return itemCol;
}
catch(Exception ex)
{
LogException(ex);
}
return null;
}
我会这样做:
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
return itemCol != null && itemCol.Count == 0 ? null : itemCol;
}
catch(Exception ex)
{
LogException(ex);
return null;
}
}
你的代码看起来不错。如果它更适合您的口味,您可以将 null 返回放在末尾:
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
if(itemCol != null)
return itemCol;
}
catch(Exception ex)
{
LogException(ex);
}
return null;
}
我同意以下内容:
来自 IDesign 编码标准 v2.4 (http://idesign.net/Downloads/GetDownload/1985):
- 仅捕获具有显式处理的异常。
让方法的调用方实现 try/catch 并处理异常。我会说在异常时返回 null 通常是一种不好的做法,因为您向调用方隐藏了信息并阻止框架收集正确的调用堆栈。为什么首先会抛出异常?同样,捕获您知道的显式异常类型,然后处理它。不要捕获其他/所有异常。