为什么ReSharper的说扔“单catch子句‘’语句是多余的”?(Why does reshar

2019-06-23 17:19发布

我想抛出异常是很好的做法,让IT泡沫备份到UI或地方在那里你登录异常,并通知用户了。

为什么ReSharper的说,这是多余的?

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

Answer 1:

因为

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);
}

不会是多余的。



Answer 2:

由于上述语句具有相同的行为,如果它不在那里。 同写:

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


Answer 3:

因为在尝试代码已经抛出异常。

你只想要赶上并重新抛出异常,如果你打算做别的事情在catch块除了重新抛出异常。



Answer 4:

因为它是多余的。



Answer 5:

你有没有做过任何处理的catch块,只需再次抛出的异常。

它警告你,因为在其那里,try ... catch块是没有意义的。

此外,另一个很好的提示是“扔恩”将不保留堆栈跟踪,但“扔”的意愿。



Answer 6:

值得一提的是,虽然...

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

......是reduntant,下面是不是...

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

这第二代码片段充斥通过我继承了几个项目,前一个代码库,它有隐藏原始异常的堆栈跟踪的讨厌的效果。 投掷,你只是陷入了这样的例外是指堆栈跟踪的顶部是在throw水平,没有提到DoSomething或任何嵌套方法调用实际上导致异常。

祝你好运调试代码,干这种事!



文章来源: Why does resharper say 'Catch clause with single 'throw' statement is redundant'?