是否有理由两次抛出异常?

时间:2013-04-17 23:06:31

标签: c# exception-handling try-catch throw

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

有没有理由有2个投掷声明?如果是这样,那在什么情况下才有意义呢?

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

3 个答案:

答案 0 :(得分:10)

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

它也类似于

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

<强>更新

Resharper是检查此类内容的绝佳工具。

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

enter image description here

答案 1 :(得分:3)

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

答案 2 :(得分: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;
    }