Блок '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 идеальным для операций очистки, таких как закрытие файлов, освобождение ресурсов или логирование завершения операции. Независимо от того, что происходит при обработке ошибок, вы можете гарантировать, что определенный код будет выполнен всегда.
Задание
ЛегкоСоздайте программу, демонстрирующую работу блока finally, реализовав симулятор обработки файлов, который всегда выполняет операции очистки независимо от того, возникла ли ошибка во время обработки.
- Прочитайте строковый ввод, представляющий имя файла для обработки
- Прочитайте строковый ввод, представляющий содержимое файла
- Прочитайте строковый ввод, указывающий, следует ли симулировать ошибку (
"error"или"success") - Используйте структуру
try-catch-finallyдля имитации обработки файла: - В блоке
try: Проверьте, равен ли ввод симуляции ошибки"error", и если да, выбросьте исключение с сообщением"File processing failed", в противном случае успешно обработайте файл - В блоке
catch: Обработайте любое исключение, возникшее во время обработки - В блоке
finally: Всегда выполняйте операции очистки независимо от успеха или неудачи - Выведите результаты обработки в точном формате, показанном ниже
Например, если входные данные — "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: всегда выполняйте операции по очистке ресурсов
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей6Основы обработки ошибок
Что такое исключения?Блок 'try-catch'Перехват исключений с помощью 'on'Блок 'finally'Генерация исключенияИтоги: Безопасное деление