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

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

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

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

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

Ответ 1

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

Ответ 2

Наконец, будет отменено независимо от того, что не имеет значения.

Ответ 3

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

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

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

Ответ 4

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

Что действительно происходит в try {return x; } наконец {x = null; }?

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Смотрите также fooobar.com/info/30203/.... Здесь jon skeet answer не только разъясняет ваши сомнения, но и дает дополнительную информацию.