Почему resharper говорит: «Catch-предложение с одним оператором throw избыточно»? - PullRequest
19 голосов
/ 19 июня 2009

Я подумал, что выбрасывать исключение - это хорошая практика, чтобы позволить пузырю вернуться обратно в пользовательский интерфейс или куда-то, где вы регистрируете исключение и уведомляете об этом пользователя.

Почему резарпер говорит, что это избыточно?

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

Ответы [ 6 ]

56 голосов
/ 19 июня 2009

Потому что

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

не будет избыточным.

17 голосов
/ 19 июня 2009

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

File.Open("FileNotFound.txt", FileMode.Open);
4 голосов
/ 19 июня 2009

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

4 голосов
/ 19 июня 2009

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

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

1 голос
/ 23 июля 2009

Стоит отметить, что пока ...

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

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

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

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

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

1 голос
/ 19 июня 2009

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

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

Также еще один хороший совет: «throw ex» не сохранит трассировку стека, а «throw» будет.

...