Это плохая практика, чтобы вернуться из блока try catch catch finally?

StackOverflow https://stackoverflow.com/questions/449099

  •  19-08-2019
  •  | 
  •  

Вопрос

Итак, сегодня утром я наткнулся на некоторый код, который выглядел так:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

Теперь этот код прекрасно компилируется и работает как надо, но он просто не чувствует себя нужным возвращаться из блока try, особенно если есть что-то в конце концов.

Моя главная проблема в том, что произойдет, если в конце концов будет выброшено собственное исключение? У вас есть возвращенная переменная, но также есть исключение, с которым нужно иметь дело ... поэтому мне интересно узнать, что другие думают о возвращении из блока try?

Это было полезно?

Решение

Нет, это не плохая практика. Помещение return там, где это имеет смысл, улучшает читабельность и удобство обслуживания, а также упрощает понимание кода. Вас не должно волновать, что блок finally будет выполнен, если встретится оператор <=>.

Другие советы

Наконец, будет выполняться, несмотря ни на что, это не имеет значения.

Лично я бы избегал такого рода кодирования, поскольку мне не хотелось бы видеть операторы return перед операторами наконец.

Мой разум прост и обрабатывает вещи довольно линейно. Поэтому, когда я прохожу код для пробного запуска, у меня будет склонность думать, что, как только я доберусь до оператора return, все последующее не имеет значения, что, очевидно, довольно неправильно в этом случае (не то, что это повлияет на оператор return, но какие побочные эффекты могут быть).

Таким образом, я бы расположил код так, чтобы оператор return всегда появлялся после операторов finally.

Это может ответить на ваш вопрос

Что на самом деле происходит в попробуй {верни х; } наконец {х = ноль; } заявление?

После прочтения этого вопроса звучит так, как будто вы можете использовать другую структуру try catch в операторе finally, если считаете, что это может вызвать исключение. Компилятор выяснит, когда возвращать значение.

Тем не менее, может быть, в любом случае было бы лучше реструктурировать ваш код, чтобы в дальнейшем это не смутило вас или кого-то еще, кто может не знать об этом.

Функционально разницы нет.

Однако есть одна причина не делать этого. Более длинные методы с несколькими точками выхода часто труднее читать и анализировать. Но это возражение больше относится к операторам возврата, чем к командам catch и наконец.

В вашем примере оба варианта эквивалентны, я даже не удивлюсь, если компилятор сгенерирует тот же код. Если в блоке finally происходит исключение, у вас возникают те же проблемы, независимо от того, помещаете ли вы оператор return в блок или вне его.

Настоящий вопрос стилистически лучше. Мне нравится писать свои методы так, чтобы был только один оператор return, таким образом легче увидеть поток из метода, из этого следует, что мне также нравится помещать оператор return последним, так что легко видеть, что это конец метода и вот что он возвращает.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top