Выполняется ли код в итоге, если у меня есть возврат в мой catch() в С#?

У меня есть следующий фрагмент кода/пример. Это не работает код, я просто написал это, чтобы задать вопрос об уловке, наконец и вернуть:

try
{
    doSomething();
}
catch (Exception e)
{
    log(e);
    return Content("There was an exception");
}
finally
{
    Stopwatch.Stop();
}
if (vm.Detail.Any())
{
    return PartialView("QuestionDetails", vm);
}
else
{
    return Content("No records found");
}

Из того, что я понимаю, если в блоке try есть исключение, он поймает. Однако, если в уловке есть оператор return, будет ли наконец выполнен? Это правильный способ закодировать уловку и, наконец,?

Ответ 1

В рамках обработанного исключения гарантированный связанный блок finally для запуска. Однако, если исключение необработанно, выполнение блок finally зависит от того, как выполняется операция исключения срабатывает. Это, в свою очередь, зависит от того, как настроен ваш компьютер. Для получения дополнительной информации см. Обработка необработанных исключений в среде CLR.

Ссылка: Try-finally

Ответ 2

Да finally будет выполнен, даже если вы return что-то раньше.

Блок finally полезен для очистки любых ресурсов, выделенных в блоке try, и для запуска любого кода, который должен выполняться, даже если в блоке try возникает исключение. Как правило, инструкции блока finally выполняются, когда элемент управления оставляет оператор try, независимо от того, происходит ли передача управления в результате нормального выполнения, выполнения разрыва, continue, goto или return statement или распространения исключения из инструкции try.

Дополнительная информация

MSDN - try-finally (ссылка С#)

Ответ 3

finally будет выполняться, даже если в блоке catch есть возврат

блок finally всегда выполняется

Ответ 4

finally будет выполняться после выхода catch-блока (в вашем случае с помощью явного "возврата" ). Тем не менее, все после окончательного блока (в вашем случае if (vm.Detail.Any()) ...) не будет выполняться.

Ответ 5

Код в блоке finally будет работать, несмотря на оператор return в вашем блоке catch. Тем не менее, я лично назначил результат переменной и вернул бы ее после блока. Но это просто вопрос вкуса.