Menu
Coddy logo textTech

Блок 'finally'

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 41 из 65.

Иногда вам нужен код, который выполняется независимо от того, что происходит в вашем блоке try-catch. Блок finally служит именно для этой цели — он содержит код, который выполняется всегда, независимо от того, возникло исключение или нет.

Блок finally следует за вашими блоками try и catch. Даже если ваш код успешно выполняется в секции try или если исключение перехвачено и обработано, блок finally всё равно будет выполнен.

try {
  // Код, который может вызвать исключение
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

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

challenge icon

Задание

Легко

Создайте программу, демонстрирующую работу блока finally, реализовав симулятор обработки файлов, который всегда выполняет операции очистки независимо от того, возникла ли ошибка во время обработки.

  1. Прочитайте строковый ввод, представляющий имя файла для обработки
  2. Прочитайте строковый ввод, представляющий содержимое файла
  3. Прочитайте строковый ввод, указывающий, следует ли симулировать ошибку ("error" или "success")
  4. Используйте структуру try-catch-finally для имитации обработки файла:
    • В блоке try: Проверьте, равен ли ввод симуляции ошибки "error", и если да, выбросьте исключение с сообщением "File processing failed", в противном случае успешно обработайте файл
    • В блоке catch: Обработайте любое исключение, возникшее во время обработки
    • В блоке finally: Всегда выполняйте операции очистки независимо от успеха или неудачи
  5. Выведите результаты обработки в точном формате, показанном ниже

Например, если входные данные — "document.txt", "Hello World", "success", ваша программа должна вывести:

File Processing System
======================
Opening file: document.txt
File content: Hello World
Processing file successfully...
File processed: 11 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfully

Если входные данные — "report.pdf", "Annual Report Data", "error", ваша программа должна вывести:

File Processing System
======================
Opening file: report.pdf
File content: Annual Report Data
Error occurred: File processing failed
Unable to complete file processing
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed with errors

Если входные данные — "config.json", "{\"setting\": \"value\"}", "success", ваша программа должна вывести:

File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 19 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfully

Ваша программа должна использовать структуру try-catch-finally, где блок finally всегда выполняет три операции очистки в точно указанном порядке. В блоке try проверьте, равен ли ввод симуляции ошибки "error", и выбросьте исключение, если это так. Если ошибка не симулируется, подсчитайте количество символов в содержимом файла, используя свойство length. Блок finally должен всегда выводить сообщения об очистке и определять окончательный статус завершения в зависимости от того, произошла ли ошибка.

Шпаргалка

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

try {
  // Код, который может вызвать исключение
  int result = 10 ~/ 2;
  print("Result: $result");
} catch (e) {
  print("An error occurred: $e");
} finally {
  print("This always runs!");
}

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

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

import 'dart:io';

void main() {
  // Чтение входных данных
  String? filename = stdin.readLineSync();
  String? content = stdin.readLineSync();
  String? errorSimulation = stdin.readLineSync();
  
  // Отображение заголовка системы
  print("File Processing System");
  print("======================");
  print("Opening file: $filename");
  print("File content: $content");
  
  // TODO: Напишите свой код ниже
  // Используйте структуру try-catch-finally для имитации обработки файла
  // - В блоке try: проверьте, равно ли errorSimulation значению "error", и выбросьте исключение, если это так
  // - В блоке catch: обработайте любое исключение
  // - В блоке finally: всегда выполняйте операции по очистке ресурсов
  
}
quiz iconПроверьте себя

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

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