调试生产代码我遇到了一些我以前从未见过的东西,并且我没有意识到有效的目的。 在我们的一个控制器的几种方法中,我们有try-catch块。 有趣的是,其中一个捕获中有2个抛出语句。

有没有理由有2个抛出语句? 如果是这样,在什么情况下这是有道理的?

        try
        {
           //statements
        }
        catch (SoapException se)
        {
            //Log statement
            return null;
        }
        catch (Exception ex)
        {
            //Log statement
            throw;
            throw;
        }

===============>>#1 票数:10 已采纳

没有理由throw两次。 永远不会达到第二次throw

它也类似于

public int GetNumber()
{
    return 1;
    return 2; // Never reached
}

更新

Resharper是一个很好的工具来检查这样的事情。

在这种情况下,它将灰显第二次throw并告诉你它无法到达。

在此输入图像描述

===============>>#2 票数:3

连续两次抛出异常绝对没有任何意义。 永远无法达到第二次throw ,并且它很可能是一个错字,或编辑过的代码,但从未完成,因此被遗忘。

===============>>#3 票数:3

在您展示的示例中,两个throw语句没有任何意义。 一旦第一个被击中,它就会开始恢复调用堆栈,直到它被捕获为止。 两个人做出任何分歧的唯一方法是,如果第一个是有条件的,或者在第二个被击中之前被捕获。

    try
    {
       //statements
    }
    catch (SoapException se)
    {
        //Log statement
        return null;
    }
    catch (Exception ex)
    {
        //Log statement
        if (condition)
            throw;
        throw;
    }

要么

    try
    {
       //statements
    }
    catch (SoapException se)
    {
        //Log statement
        return null;
    }
    catch (Exception ex)
    {
        //Log statement
        try
        {
             throw;
        }
        catch (Exception)
        {
             //Handle first thrown exception.
        }
        throw;
    }

  ask by John translate from so

未解决问题?本站智能推荐: