Будут ли наконец выполнены блоки при возврате из блоков try или catch в C #?Если это так, до возвращения или после? - PullRequest
13 голосов
/ 15 сентября 2010

Нет доступных материалов!

Ответы [ 4 ]

45 голосов
/ 15 сентября 2010

Да, блок finally выполняется, однако поток покидает блок try - достигая конца, возвращая или выбрасывая исключение.

Из спецификации C # 4, раздел 8.10:

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

(Разумеется, в разделе 8.10 гораздо больше подробностей).

Обратите внимание, что возвращаемое значение определяется за до , хотя выполняется блок finally, поэтому, если вы сделали это:

int Test()
{
    int result = 4;
    try
    {
        return result;
    }
    finally
    {
        // Attempt to subvert the result
        result = 1;
    }
}

... все равно будет возвращено значение 4, а не 1 - назначение в блоке finally не окажет никакого влияния.

6 голосов
/ 15 сентября 2010

Блок finally всегда будет выполняться, и это произойдет до возврата из метода, так что вы можете безопасно написать код, подобный этому:

try {
    return "foo";
} finally {
    // This will always be invoked
}

или если вы работаете с доступными ресурсами:

using (var foo = GetFoo())
{
    // foo is guaranteed to be disposed even if an exception is thrown
    return foo.Bar();
}
3 голосов
/ 15 сентября 2010

С обработкой двухпроходного исключения, которое .NET наследует от Windows, вы не можете точно сказать, что блок finally выполняется до того, как управление вернется к вызывающей стороне.

Блок finally будет выполняться после блоков finally в более вложенных фреймах вызова и до блоков finally и блока catch в менее вложенных фреймах вызова, что согласуется с блоком finally, выполняемым перед возвратом. Но все фильтры исключений между точкой выброса и точкой захвата будут выполняться перед любыми блоками finally, что означает, что при наличии исключения некоторый код вызывающей стороны может выполняться перед блоком finally.

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

2 голосов
/ 15 сентября 2010

Будут ли наконец выполнены блоки при возврате из блоков try или catch в C-Sharp?

ДА

Если будет, До возвращения или после?

до

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