为什么Resharper认为这个catch子句是多余的?

时间:2016-07-19 21:39:47

标签: c# resharper

Resharper认为最后一个catch子句是多余的。为什么呢?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);

try
{
    var response = (HttpWebResponse) request.GetResponse();
    using (var streamReader = new StreamReader(response.GetResponseStream()))
    {
        var jsonResult = streamReader.ReadToEnd();
    }
}
catch (WebException e)
{
    Exception newEx;
    if (e.Response != null)
    {
        using (var sr = new StreamReader(e.Response.GetResponseStream()))
        {
            newEx = new Exception(sr.ReadToEnd(), e);
        }
    }
    else
    {
        newEx = new Exception(e.Message, e);                    
    }

    throw newEx;
}
catch (Exception ex)  // Resharper thinks this clause is redundant
{
    throw;
}

2 个答案:

答案 0 :(得分:8)

因为它是一种默认行为 - 未被捕获的异常将进一步发展,而无需重新抛出它们。

C# reference

  

抛出异常时,公共语言运行库(CLR)会查找处理此异常的catch语句。如果当前正在执行的方法不包含这样的catch块,则CLR会查看调用当前方法的方法,依此类推调用堆栈。

在您的特定情况下,如果您不会重新抛出异常,那么WebException clr将继续展开堆栈以寻找下一个try-catch。

如果你重新抛出异常,clr将继续展开堆栈,寻找下一个try-catch。

所以,没有区别。

答案 1 :(得分:6)

可能是因为除了重新抛出相同的异常之外,你的阻止块没有做任何事情:

catch (Exception ex)  // Resharper thinks this clause is redundant
{
    throw;
}

你可以通过在catch块中添加一些代码来证明它。