Выполняется ли код, наконец, если у меня есть возврат в моем 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 есть исключение, оно будет поймано. Однако, если в улове есть оператор возврата, будет ли он наконец выполнен? Это правильный способ закодировать улов и, наконец,?


person Angela    schedule 28.08.2012    source источник
comment
velocityreviews.com/forums/   -  person Amiram Korach    schedule 28.08.2012


Ответы (5)


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

Ссылка: попробовать окончательно

person Mitch Wheat    schedule 28.08.2012

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

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

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

MSDN — попробуйте-наконец (справочник по C#)

person dknaack    schedule 28.08.2012
comment
Спасибо. Итак, наконец, выполняется до возврата или это делается асинхронно? - person Angela; 28.08.2012
comment
Наконец, сначала будет выполнено. - person dknaack; 28.08.2012

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

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

person Massimiliano Peluso    schedule 28.08.2012

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

person Christian.K    schedule 28.08.2012

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

person geratri    schedule 28.08.2012