Blok „finally”
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 41 z 65.
Czasami potrzebujesz kodu, który wykona się niezależnie od tego, co wydarzy się w bloku try-catch. Blok finally służy właśnie do tego — zawiera kod, który zawsze się wykonuje, niezależnie od tego, czy wystąpi wyjątek.
Blok finally występuje po blokach try i catch. Nawet jeśli kod wykona się pomyślnie w sekcji try albo wyjątek zostanie przechwycony i obsłużony, blok finally i tak zostanie wykonany.
try {
// Kod, który może spowodować wyjątek
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}Dzięki temu blok finally doskonale nadaje się do operacji porządkowych, takich jak zamykanie plików, zwalnianie zasobów czy rejestrowanie informacji o zakończeniu operacji. Niezależnie od tego, co wydarzy się podczas obsługi błędów, możesz mieć pewność, że określony kod zawsze zostanie wykonany.
Wyzwanie
ŁatwyUtwórz program demonstrujący blok finally poprzez zaimplementowanie symulatora przetwarzania plików, który zawsze wykonuje operacje porządkowe, niezależnie od tego, czy podczas przetwarzania wystąpi błąd.
- Wczytaj ciąg znaków reprezentujący nazwę pliku do przetworzenia
- Wczytaj ciąg znaków reprezentujący zawartość pliku
- Wczytaj ciąg znaków określający, czy symulować błąd (
"error"lub"success") - Użyj struktury
try-catch-finally, aby zasymulować przetwarzanie pliku: - W bloku
try: sprawdź, czy symulacja błędu ma wartość"error", i jeśli tak, zgłoś wyjątek z komunikatem"File processing failed"; w przeciwnym razie przetwórz plik pomyślnie - W bloku
catch: obsłuż każdy wyjątek, który wystąpi podczas przetwarzania - W bloku
finally: zawsze wykonaj operacje porządkowe, niezależnie od tego, czy przetwarzanie zakończyło się powodzeniem, czy niepowodzeniem - Wyświetl wyniki przetwarzania dokładnie w formacie pokazanym poniżej
Na przykład, jeśli dane wejściowe to "document.txt", "Hello World", "success", program powinien wyświetlić:
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 successfullyJeśli dane wejściowe to "report.pdf", "Annual Report Data", "error", program powinien wyświetlić:
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 errorsJeśli dane wejściowe to "config.json", "{\"setting\": \"value\"}", "success", program powinien wyświetlić:
File Processing System
======================
Opening file: config.json
File content: {"setting": "value"}
Processing file successfully...
File processed: 20 characters found
Cleanup: Closing file handles
Cleanup: Releasing memory resources
Cleanup: Logging operation completion
Processing completed successfullyTwój program musi używać struktury try-catch-finally, w której blok finally zawsze wykonuje trzy operacje porządkowe w dokładnie takiej kolejności, jak pokazano. W bloku try sprawdź, czy dane wejściowe symulujące błąd są równe "error", i jeśli tak, zgłoś wyjątek. Jeśli nie jest symulowany żaden błąd, policz znaki w zawartości pliku, używając właściwości length. Blok finally powinien zawsze wyświetlać komunikaty o porządkowaniu i określać końcowy status na podstawie tego, czy wystąpił błąd.
Spróbuj swoich sił
import 'dart:io';
void main() {
// Odczytaj dane wejściowe
String? filename = stdin.readLineSync();
String? content = stdin.readLineSync();
String? errorSimulation = stdin.readLineSync();
// Wyświetl nagłówek systemowy
print("File Processing System");
print("======================");
print("Opening file: $filename");
print("File content: $content");
// TODO: Napisz swój kod poniżej
// Użyj struktury try-catch-finally, aby zasymulować przetwarzanie pliku
// - W bloku try: sprawdź, czy errorSimulation jest równe "error", a jeśli tak, rzuć wyjątek
// - W bloku catch: obsłuż dowolny wyjątek
// - W bloku finally: zawsze wykonuj operacje porządkowe
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gości6Podstawy obsługi błędów
Czym są wyjątki?Blok „try-catch”Przechwytywanie wyjątków za pomocą „on”Blok „finally”Rzucanie wyjątkuPodsumowanie – bezpieczne dzieleniePoćwicz samodzielnie: Kompilator Dart online