Вы также можете использовать эхо с фигурными скобками,
$ (echo hello; echo world)
hello
world
Поскольку
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);
}
не будет лишним.
Потому что приведенный выше оператор ведет себя так же, как если бы его не было. То же, что и при написании:
File.Open("FileNotFound.txt", FileMode.Open);
Поскольку код в попытке уже генерирует исключение.
Вам нужно только перехватить и повторно выбросить исключение, если вы собираетесь сделать что-то еще в блоке catch в дополнение к повторному вызову исключения.
Вы не выполнили никакой обработки в блоке catch, просто снова выбросили исключение.
Он предупреждает вас, потому что нет смысла иметь там блок try ... catch.
Также есть еще один хороший совет: "throw ex" не сохраняет трассировку стека, а "throw" сохраняет.
Стоит отметить, что хотя ...
try
{
DoSomething();
}
catch
{
throw;
}
... избыточно, следующее не является ...
try
{
DoSomething();
}
catch (Exception ex)
{
// Generally a very bad idea!
throw ex;
}
Этот второй фрагмент кода был распространен через базу кода, которую я унаследовал несколько проектов назад, и это имеет неприятный эффект, заключающийся в сокрытии исходной трассировки стека исключения. Выдача исключения, которое вы только что поймали таким образом, означает, что вершина трассировки стека находится на уровне throw
, без упоминания о DoSomething
или любых вызовах вложенных методов, фактически вызвавших исключение. .
Удачи в отладке кода, который делает это!