Итак, сегодня утром я наткнулся на код, который выглядел так:
try
{
x = SomeThingDangerous();
return x;
}
catch (Exception ex)
{
throw new DangerousException(ex);
}
finally
{
CleanUpDangerousStuff();
}
Теперь этот код отлично компилируется и работает так, как должен, но кажется неправильным возвращаться из блока try, особенно если есть связанный файл finally.
Моя основная проблема в том, что произойдет, если, наконец, выдаст собственное исключение? У вас есть возвращаемая переменная, но также есть исключение, с которым нужно иметь дело ... поэтому мне интересно знать, что другие думают о возвращении из блока try?
c#
try-catch
try-catch-finally
lomaxx
источник
источник
x
за пределамиtry
блока. Вы можете хранить его объявление рядом с его использованием.Ответы:
Нет, это неплохая практика. Размещение
return
там, где это имеет смысл, улучшает читабельность и ремонтопригодность, а также упрощает понимание кода. Вам не нужно беспокоиться о том, чтоfinally
блок будет выполнен, еслиreturn
встретится оператор.источник
Final будет выполнен несмотря ни на что, поэтому это не имеет значения.
источник
Лично я бы избегал такого рода кодирования, так как мне не хочется видеть операторы return перед операторами finally.
Мой разум прост и обрабатывает вещи довольно линейно. Поэтому, когда я просматриваю код для сухого прогона, у меня будет тенденция думать, что, как только я смогу добраться до оператора return, все последующее не имеет значения, что, очевидно, в данном случае неверно (не то чтобы это повлияло на оператор return, но какие могут быть побочные эффекты).
Таким образом, я бы расположил код так, чтобы оператор return всегда появлялся после операторов finally.
источник
Это может ответить на ваш вопрос
Что на самом деле происходит при попытке {return x; } наконец {x = null; } заявление?
Из прочтения этого вопроса кажется, что у вас может быть еще одна структура try catch в инструкции finally, если вы думаете, что она может вызвать исключение. Компилятор определит, когда вернуть значение.
Тем не менее, может быть, в любом случае лучше реструктурировать ваш код, чтобы он не сбивал вас с толку позже или кого-то еще, кто может не знать об этом.
источник
Функционально разницы нет.
Однако есть одна причина не делать этого. Более длинные методы с несколькими точками выхода часто труднее читать и анализировать. Но это возражение больше связано с операторами return, чем с блокировками catch и finally.
источник
В вашем примере любой из способов эквивалентен, я бы даже не удивился, если бы компилятор сгенерировал тот же код. Если исключение происходит в блоке finally, у вас одни и те же проблемы, независимо от того, помещаете ли вы оператор return в блок или вне его.
Настоящий вопрос - стилистически, что лучше. Мне нравится писать свои методы так, чтобы был только один оператор возврата, так легче увидеть поток выхода из метода, из этого следует, что я также предпочитаю ставить оператор возврата последним, чтобы было легко увидеть, что это конец метода и то, что он возвращает.
Я думаю, что, если оператор return так аккуратно помещен в качестве последнего оператора, другие с меньшей вероятностью придут и поместят несколько операторов return в другие части метода.
источник