为什么resharper说'Catch子句与单'throw'语句是多余的?

时间:2009-06-19 17:55:10

标签: exception-handling try-catch resharper rethrow

我认为抛出异常是一种很好的做法,让它冒泡回到用户界面或记录异常的地方并通知用户。

为什么resharper说这是多余的?

try
{
    File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
    throw;
}

6 个答案:

答案 0 :(得分:56)

由于

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch {
    throw;
}

没什么不同
File.Open("FileNotFound.txt", FileMode.Open);

如果对File.Open(string, FileMode)的调用失败,那么在任一示例中,完全相同的异常将会找到UI。

在上面的catch子句中,您只是在不执行任何其他操作的情况下捕获并重新抛出异常,例如记录,回滚事务,包装异常以向其添加其他信息,或者在所有

然而,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    GetLogger().LogException(ex);
    throw;
}

不会包含任何裁员,ReSharper不应该抱怨。同样地,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    throw new MyApplicationException(
        "I'm sorry, but your preferences file could not be found.", ex);
}

不会多余。

答案 1 :(得分:17)

因为上面的语句具有与不存在相同的行为。与写作相同:

File.Open("FileNotFound.txt", FileMode.Open);

答案 2 :(得分:4)

因为try中的代码已经抛出了异常。

除了重新抛出异常之外,如果要在catch块中执行其他操作,您只需要捕获并重新抛出异常。

答案 3 :(得分:4)

因为它是多余的。

答案 4 :(得分:1)

你没有在catch块中做任何处理,只是再次抛出异常。

它警告你,因为没有必要尝试......抓住那里。

另外,另一个好的提示是“throw ex”不会保留堆栈跟踪,但会“抛出”。

答案 5 :(得分:1)

值得注意的是,虽然......

try
{
    DoSomething();
}
catch
{
    throw;
}

...是还原剂,以下不是......

try
{
    DoSomething();
}
catch (Exception ex)
{
    // Generally a very bad idea!
    throw ex;
}

第二个代码片段充斥着我在几个项目之前继承的代码库,并且它具有隐藏原始异常的堆栈跟踪的令人讨厌的效果。抛出刚刚以这种方式捕获的异常意味着堆栈跟踪的顶部处于throw级别,没有提到DoSomething或任何嵌套方法调用实际导致异常。

祝你好运调试代码!