Зачем использовать Наконец в Try ... Catch - PullRequest
45 голосов
/ 21 июля 2009

Я вижу, что Finally в Try .. Catch всегда будет выполняться после любых частей выполнения блока try catch.

Разве можно просто пропустить раздел Finally и запустить его после блока try catch?

Пример 1, Try ... Catch ... Наконец ... End Try

    Try
        'Do something
    Catch ex As Exception
        'Handle exception
    Finally
        'Do cleanup
    End Try

Пример 2, Попробуй ... Поймай ... Конец Попробуй ... Сделай наконец что-то вне

    Try
        'Do something
    Catch ex As Exception
        'Handle exception
    End Try
    'Do cleanup

Ответы [ 14 ]

1 голос
/ 21 июля 2009

Вы используете наконец для кода очистки, например, соединения БД или открытые файлы, которые должны быть закрыты. Практически любой код очистки, который должен выполняться независимо от исключения или нет

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

0 голосов
/ 12 мая 2010

Что я часто использую (я заключил это в аспект, но это то, что я вывел аспект):

public static DoLengthyProcessing(this Control control, Action<Control> action)
{
    Cursor oldCursor = control.Cursor
    try
    {
        control.Cursor = Cursors.WaitCursor;
        action(control);
    }
    catch (Exception ex)
    {
        ErrorHandler.Current.Handler(ex);
    }
    finally
    {
        control.Cursor = oldCursor;
    }
}

Или используйте АОП (как я).

0 голосов
/ 22 июля 2009

Прочитав ответ на мой комментарий выше, я подумал о нескольких вещах.

В принципе, на этот вопрос нельзя ответить полностью, не зная кода.

Причина в том, что не весь код может быть помещен в блок finally. Например. операторы yield не допускаются в блоках finally (и catch). Блок try может иметь несколько веток исполнения, где некоторые возвращаются, а некоторые нет. Наконец, выполняется во всех этих случаях, в то время как в примере с отсутствием finally это не относится к коду очистки. Более того, вы не можете перейти (перейти) в блок finally, хотя очень редко вы можете перейти к коду после блока catch. Вы также не можете вернуться из блока finally.

Существует довольно много, хотя в большинстве случаев необычных случаев, когда ответ зависит от фактического кода.

0 голосов
/ 21 июля 2009

Catch будет не запускаться после выполнения любых частей блока try catch. Catch будет only , если выброшено исключение и блок catch может обработать этот тип исключения.

Блок finally - это тот, который будет запускаться после завершения блока try. Под завершением я подразумеваю, что он нормально завершается или каким-то образом завершается (выходит из цикла, возвращается из метода, вызывает исключение и т. Д.)

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

По сути, очистка должна быть помещена в блок finally.

...