2

调试生产代码我遇到了一些我以前从未见过的东西,并且不知道它的有效用途。在我们的一个控制器的几种方法中,我们有 try-catch 块。有趣的部分是其中一个 catch 中有 2 个 throw 语句。

有任何理由有 2 个 throw 语句吗?如果是这样,在什么情况下这有意义?

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

3 回答 3

10

不,没有理由要throw两次。第二个throw永远也达不到。

它也类似于拥有

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

更新

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

在这种情况下,它会使第二个变灰throw并告诉您它无法访问。

在此处输入图像描述

于 2013-04-17T23:09:17.423 回答
3

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

于 2013-04-17T23:11:43.917 回答
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;
    }
于 2013-04-17T23:17:37.847 回答