Почему resharper говорит, что 'Пункт выгоды с единственным оператором 'броска' избыточен'?

Вы также можете использовать эхо с фигурными скобками,

$ (echo hello; echo world)
hello
world
19
задан Deduplicator 22 February 2015 в 23:39
поделиться

6 ответов

Поскольку

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

ничем не отличается от

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

Если вызов File.Open (string, FileMode) завершился неудачно, то в любом примере будет одно и то же исключение найти свой путь до пользовательского интерфейса.

В приведенном выше предложении 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);
}

не будет лишним.

56
ответ дан 30 November 2019 в 01:53
поделиться

Потому что приведенный выше оператор ведет себя так же, как если бы его не было. То же, что и при написании:

File.Open("FileNotFound.txt", FileMode.Open);
17
ответ дан 30 November 2019 в 01:53
поделиться

Поскольку код в попытке уже генерирует исключение.

Вам нужно только перехватить и повторно выбросить исключение, если вы собираетесь сделать что-то еще в блоке catch в дополнение к повторному вызову исключения.

4
ответ дан 30 November 2019 в 01:53
поделиться

Потому что это избыточно.

4
ответ дан 30 November 2019 в 01:53
поделиться

Вы не выполнили никакой обработки в блоке catch, просто снова выбросили исключение.

Он предупреждает вас, потому что нет смысла иметь там блок try ... catch.

Также есть еще один хороший совет: "throw ex" не сохраняет трассировку стека, а "throw" сохраняет.

1
ответ дан 30 November 2019 в 01:53
поделиться

Стоит отметить, что хотя ...

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

... избыточно, следующее не является ...

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

Этот второй фрагмент кода был распространен через базу кода, которую я унаследовал несколько проектов назад, и это имеет неприятный эффект, заключающийся в сокрытии исходной трассировки стека исключения. Выдача исключения, которое вы только что поймали таким образом, означает, что вершина трассировки стека находится на уровне throw , без упоминания о DoSomething или любых вызовах вложенных методов, фактически вызвавших исключение. .

Удачи в отладке кода, который делает это!

1
ответ дан 30 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: