Возвращаясь из функции через блок catch, что происходит с блоком finally?

Я пробовал поймать блок finally, и если возникнет какое-то исключение, я вернусь из блока catch, поэтому блок finally все еще выполняется, если да, то когда? До возвращения или после возвращения?

Это правильная практика?

try
{
// do something
}

catch (Exception)
{    
  return false;
}
finally
{
  if (connection.State == ConnectionState.Open) connection.Close();
}

person JPReddy    schedule 08.12.2010    source источник
comment
Вы можете узнать, если вы установили точку останова на обеих строках в catch и в finally?   -  person RvdK    schedule 08.12.2010
comment
Хитрый ...... Я знаю! - Вы можете запустить его и посмотреть, что произойдет.   -  person Andy Morris    schedule 08.12.2010


Ответы (4)


Он выполнит блок «finally» после возврата. «Наконец» используется для некоторой практики, например, для закрытия соединения с базой данных (всегда нужно делать)

person Hoàng Long    schedule 08.12.2010
comment
Можно подумать, что finally не нужен, если вы используете using. - person Dialecticus; 08.12.2010
comment
using может применяться только к экземплярам, ​​которые реализуют интерфейс IDisposeable, и компилятор преобразует блок using в адекватный блок try...finally. Изменить: ICloneable заменен на IDisposable. - person Dennis; 08.12.2010
comment
@Dialectus: это разумное предположение, учитывая, что использование - это синтаксический сахар, который заставляет компилятор вызывать Dispose с блоком finally. - person Fredrik Mörk; 08.12.2010
comment
@Dennis: Разве это не IDisposable? - person Dialecticus; 08.12.2010
comment
@Dialecticus: Ага, извини. Десять минут назад я реализовал интерфейс ICloneable для одного из своих классов. Похоже, это не выйдет из головы - person Dennis; 08.12.2010
comment
@Dennis: вы знаете, что не рекомендуется использовать ICloneable? См. здесь: stackoverflow.com/ вопросы/699210/ - person Fredrik Mörk; 08.12.2010

блок finally выполняется всегда. В вашем случае он выполняется до вашего оператора return.

person Nicolas    schedule 08.12.2010
comment
Я думаю, что finally выполняется после оператора return, но до того, как выполнение вернется к вызывающей функции. вернуться -> наконец -> вернуться. - person Dialecticus; 08.12.2010
comment
Debbuger сначала переходит к оператору return, а затем к блоку finally. Но программа сначала переходит к блоку finally, а после покидает метод. Поэтому я могу разумно сказать, что блок finally выполняется до оператора return (выход из метода). - person Nicolas; 08.12.2010
comment
Спецификация языка C# довольно четко определяет порядок, в котором происходят события: 1) вычисляется выражение в статусе return, 2) выполняется блок finally (это повторяется для всех вложенных блоков try-finally), 3) управление возвращается к звонящий. Таким образом, finally выполняется после выполнения оператора return, но до управления возвращается вызывающей стороне. - person Fredrik Mörk; 08.12.2010
comment
@Fredrik: Это был бы ответ, а не комментарий. - person JPReddy; 09.12.2010

Вы можете попробовать с собой

private bool test()
    {
        try
        {
            int i = 0;
           int u = 10 / i;
        }

        catch (Exception)
        {
            return false;
        }
        finally
        {

        }
        return true;
    }

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

это что-то вроде Runtime возвращаемого результата в случае блока finally!

person TalentTuner    schedule 08.12.2010

Блок finally всегда будет выполняться до того, как код выйдет из блока try-catch-finally (любое условие, например ThreadAbortException, которое предотвращает выполнение блока finally, предотвратит выход кода из блока try-catch-finally).

person supercat    schedule 17.12.2010