C#. Обработка исключений и блок finally

Блок finally

В этой статье я хочу рассказать об использовании ключевого слова finally в программах, написанных на C#. Тема данной статьи касается вопроса обработки исключительных ситуаций, и уже затрагивалась в уроках базового курса (Урок № 12. Обработка ошибокУрок №14. Детализация при обработке ошибок), но сегодня я расскажу о еще одном инструменте из этой области. В упомянутых выше уроках, я описывал подход к обработке ошибок, в соответствии с которым, код разделялся на два блока. В одном находился потенциально опасный код, а в другом — код обработки, возникших ошибок. Схематично это выглядит примерно так:

try
{
    //Потенциально опасный блок кода
}catch(тип_ошибок)
{
    //Обработка ошибок
}

//Дальнейшие операторы программы

Таким образом, если в блоке try, происходит ошибка (исключительная ситуация), то его выполнение прерывается и управление передается в блок catch. Если же в блоке try не возникают ошибки, то блок catch пропускается и выполнение следующий за ним оператор. А на практике, бывает необходимо выполнить некий код вне зависимости от того, происходили в потенциально опасном блоке ошибки или нет.

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

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

Схематично, использование блока finally выглядит так:

try
{
    //Потенциально опасный блок кода
}
catch (тип_ошибок)
{
    //Обработка ошибок
}
finally
{
    //Этот блок выполнится в любом случае
}

Вот так всё просто, с блоком finally мы получаем гарантию того, что важнейшие операторы программы выполнятся в любом случае (были ли ошибки во время выполнения блока try, или нет).

Добавить комментарий