从尝试返回 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 - 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):

  1. 仅捕获具有显式处理的异常。

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