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

ora*_*dov 19 resharper exception-handling try-catch rethrow

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

为什么resharper说这是多余的?

try
{
    File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
    throw;
}
Run Code Online (Sandbox Code Playgroud)

yfe*_*lum 56

因为

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch {
    throw;
}
Run Code Online (Sandbox Code Playgroud)

没有什么不同

File.Open("FileNotFound.txt", FileMode.Open);
Run Code Online (Sandbox Code Playgroud)

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

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

然而,

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

不会包含任何裁员,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);
}
Run Code Online (Sandbox Code Playgroud)

不会多余.

  • 捕获和重新捕获与没有捕获并不完全相同.抛出站点和第一个成功的catch之间的每个catch块的异常过滤器将在任何`finally`块执行之前运行; catch-and-rethrow将导致其中的所有`finally`块在运行之外的任何异常过滤器之前运行.顺便说一下,如果追赶并且重新抛出另一个更普遍的捕获块来做某事(因此捕获和重新抛出将绕过后一个捕获块),重新开始是重新开心的吗? (2认同)

Otá*_*cio 17

因为上面的语句具有相同的行为,就好像它不存在一样.与写作相同:

File.Open("FileNotFound.txt", FileMode.Open);
Run Code Online (Sandbox Code Playgroud)

  • 是.不要抓住你不会处理的东西. (9认同)
  • @John Weldon - 如果使用"throw"而不是"throw ex",堆栈跟踪将保持不变. (3认同)

Jas*_*tts 5

因为它是多余的。