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(不是空列表) - 无论是否捕获到异常。上述工作 - 但有更好的方法吗?
答案 0 :(得分:4)
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
更好用。答案 1 :(得分:4)
我必须首先说这是一件非常糟糕的事情,吞咽异常是可怕的!不要这样做!它会困扰你并使调试非常困难,更糟糕的是因为异常而返回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;
}
答案 2 :(得分:3)
从不喜欢具有多出口点的方法,
在捕获中将 itemCol 设置为null,在 try / catch 之外返回itemCol
try
{
// whatever
if(itemCol.Count == 0) itemCol = null;
}
catch(Exception x)
{
LogException(x);
itemCol = null;
}
return itemCol;
答案 3 :(得分:1)
要检查集合为空的天气,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
的结束括号后面。
答案 4 :(得分:1)
您提到您当前的实施工作正常。我假设用于获取项集合的方法返回具有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;
}
答案 5 :(得分:0)
它已经很好了,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;
}
}
答案 6 :(得分:0)
您不需要if-else
阻止,因为如果object为null,您已经返回null:
public SPListItemCollection GetACollection()
{
try
{
//Method to get an item collection from somewhere
return itemCol;
}
catch(Exception ex)
{
LogException(ex);
return null;
}
}
答案 7 :(得分:0)
这个怎么样?如果您的规格说明:
必须返回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;
}
答案 8 :(得分:0)
我会这样做:
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;
}
}
答案 9 :(得分:0)
您的代码看起来很好。如果它更符合您的口味,您可以将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;
}
答案 10 :(得分:0)
我同意以下内容:
来自IDesign编码标准v2.4(http://idesign.net/Downloads/GetDownload/1985):
- 仅捕获您已明确处理的异常。
让方法的调用者实现try / catch并处理异常。我会说,在异常情况下返回null通常是一个不好的做法,因为您要隐藏来自调用方的信息,并阻止框架收集正确的调用堆栈。为什么首先要抛出异常?同样,捕获您知道的显式异常类型,然后对其进行处理。不要捕获其他所有异常。