从try ... catch返回null的方法

时间:2012-06-01 14:33:08

标签: c# null return try-catch

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(不是空列表) - 无论是否捕获到异常。上述工作 - 但有更好的方法吗?

11 个答案:

答案 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):

     
    
        
  1. 仅捕获您已明确处理的异常。
  2.     
  

让方法的调用者实现try / catch并处理异常。我会说,在异常情况下返回null通常是一个不好的做法,因为您要隐藏来自调用方的信息,并阻止框架收集正确的调用堆栈。为什么首先要抛出异常?同样,捕获您知道的显式异常类型,然后对其进行处理。不要捕获其他所有异常。