Menu
Coddy logo textTech

Finally Block

Часть раздела Логика и управление потоком путешествия по C# на Coddy — урок 27 из 66.

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

Создайте базовую структуру try-catch-finally:

try
{
    // Код, который может выбросить исключение
    int result = 10 / 2;
    Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
    // Код, который обрабатывает исключение
    Console.WriteLine("Cannot divide by zero: " + ex.Message);
}
finally
{
    // Код, который всегда выполняется
    Console.WriteLine("This always executes");
}

Блок finally полезен для задач очистки, таких как закрытие файлов или подключений к базе данных:

System.IO.StreamReader file = null;
try
{
    file = new System.IO.StreamReader("data.txt");
    string content = file.ReadToEnd();
    Console.WriteLine(content);
}
catch (System.IO.FileNotFoundException)
{
    Console.WriteLine("File not found.");
}
finally
{
    // Всегда закрывайте файл, даже если произошло исключение
    if (file != null)
    {
        file.Close();
    }
}
challenge icon

Задание

Легко

Создайте метод с именем ProcessData, который:

  1. Принимает строковый параметр, представляющий имя файла
  2. Пытается открыть файл и прочитать его содержимое
  3. Выводит содержимое в консоль
  4. Правильно освобождает ресурсы с использованием блока finally
  5. Обрабатывает FileNotFoundException и IOException

Если файл не найден, выведите: "ERROR: File not found: [filename]"

Если возникает другая ошибка ввода-вывода, выведите: "ERROR: Could not read the file: [error message]"

Всегда выводите "File operation completed." в блоке finally, независимо от того, произошло исключение или нет.

Шпаргалка

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

Базовая структура try-catch-finally:

try
{
    // Code that might throw an exception
    int result = 10 / 2;
    Console.WriteLine("Result: " + result);
}
catch (DivideByZeroException ex)
{
    // Code that handles the exception
    Console.WriteLine("Cannot divide by zero: " + ex.Message);
}
finally
{
    // Code that always executes
    Console.WriteLine("This always executes");
}

Блок finally полезен для задач очистки, таких как закрытие файлов или подключений к базе данных:

System.IO.StreamReader file = null;
try
{
    file = new System.IO.StreamReader("data.txt");
    string content = file.ReadToEnd();
    Console.WriteLine(content);
}
catch (System.IO.FileNotFoundException)
{
    Console.WriteLine("File not found.");
}
finally
{
    // Always close the file, even if an exception occurred
    if (file != null)
    {
        file.Close();
    }
}

Попробуйте сами

using System;
using System.IO;

class Program
{
    public static void ProcessData(string filename)
    {
        // Напишите свой код здесь
    }
    
    static void Main(string[] args)
    {
        string filename = Console.ReadLine();
        ProcessData(filename);
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком