Der 'finally'-Block
Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy — Lektion 41 von 65.
Manchmal benötigen Sie Code, der unabhängig davon ausgeführt wird, was in Ihrem try-catch-Block passiert. Der finally-Block dient genau diesem Zweck – er enthält Code, der immer ausgeführt wird, unabhängig davon, ob eine Ausnahme auftritt oder nicht.
Der finally-Block folgt auf Ihre try- und catch-Blöcke. Selbst wenn Ihr Code im try-Abschnitt erfolgreich ausgeführt wird oder wenn eine Ausnahme abgefangen und behandelt wird, wird der finally-Block dennoch ausgeführt.
try {
// Code, der eine Ausnahme verursachen könnte
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}Dies macht den finally-Block perfekt für Bereinigungsoperationen wie das Schließen von Dateien, das Freigeben von Ressourcen oder das Protokollieren, dass eine Operation abgeschlossen wurde. Unabhängig davon, was in Ihrer Fehlerbehandlung passiert, können Sie garantieren, dass bestimmter Code immer ausgeführt wird.
Aufgabe
EinfachErstellen Sie ein Programm, das den finally-Block demonstriert, indem Sie einen Dateiverarbeitungssimulator implementieren, der immer Bereinigungsoperationen durchführt, unabhängig davon, ob während der Verarbeitung ein Fehler auftritt.
- Lesen Sie eine String-Eingabe ein, die den zu verarbeitenden Dateinamen darstellt
- Lesen Sie eine String-Eingabe ein, die den Dateiinhalt darstellt
- Lesen Sie eine String-Eingabe ein, die darstellt, ob ein Fehler simuliert werden soll (
"error"oder"success") - Verwenden Sie eine
try-catch-finally-Struktur, um die Dateiverarbeitung zu simulieren: - Im
try-Block: Prüfen Sie, ob die Fehlersimulation"error"ist, und werfen Sie eine Exception mit der Nachricht"File processing failed", falls dies zutrifft, andernfalls verarbeiten Sie die Datei erfolgreich - Im
catch-Block: Behandeln Sie jede Exception, die während der Verarbeitung auftritt - Im
finally-Block: Führen Sie immer Bereinigungsoperationen durch, unabhängig von Erfolg oder Misserfolg - Zeigen Sie die Verarbeitungsergebnisse im unten gezeigten exakten Format an
Wenn die Eingaben beispielsweise "document.txt", "Hello World", "success" sind, sollte Ihr Programm Folgendes ausgeben:
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 successfullyWenn die Eingaben "report.pdf", "Annual Report Data", "error" sind, sollte Ihr Programm Folgendes ausgeben:
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 errorsWenn die Eingaben "config.json", "{\"setting\": \"value\"}", "success" sind, sollte Ihr Programm Folgendes ausgeben:
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 successfullyIhr Programm muss eine try-catch-finally-Struktur verwenden, bei der der finally-Block immer die drei Bereinigungsoperationen in der exakt gezeigten Reihenfolge ausführt. Prüfen Sie im try-Block, ob die Eingabe für die Fehlersimulation gleich "error" ist, und werfen Sie eine Exception, falls dies zutrifft. Wenn kein Fehler simuliert wird, zählen Sie die Zeichen im Dateiinhalt mit der Eigenschaft length. Der finally-Block sollte immer die Bereinigungsnachrichten ausgeben und den endgültigen Abschlussstatus basierend darauf bestimmen, ob ein Fehler aufgetreten ist.
Spickzettel
Der finally-Block enthält Code, der immer nach try-catch ausgeführt wird, unabhängig davon, ob eine Ausnahme auftritt oder nicht.
try {
// Code, der eine Ausnahme verursachen könnte
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("An error occurred: $e");
} finally {
print("This always runs!");
}Der finally-Block eignet sich hervorragend für Bereinigungsarbeiten wie das Schließen von Dateien, das Freigeben von Ressourcen oder das Protokollieren des Abschlussstatus.
Probier es selbst
import 'dart:io';
void main() {
// Eingabe lesen
String? filename = stdin.readLineSync();
String? content = stdin.readLineSync();
String? errorSimulation = stdin.readLineSync();
// System-Header anzeigen
print("File Processing System");
print("======================");
print("Opening file: $filename");
print("File content: $content");
// TODO: Schreiben Sie Ihren Code unten
// Verwenden Sie eine try-catch-finally-Struktur, um die Dateiverarbeitung zu simulieren
// - Im try-Block: Prüfen, ob errorSimulation gleich "error" ist und falls ja, eine Exception werfen
// - Im catch-Block: Jede Exception behandeln
// - Im finally-Block: Immer Bereinigungsoperationen durchführen
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittene Listenmanipulation
Listen-Eigenschaften: first & lastListen-Status: isEmpty & isNotEmptyEine Liste umkehrenHinzufügen zu einer Liste: insertElemente aus Liste entfernen: removeWhereSuchen in einer Liste: indexOfEine Liste sortierenEine Liste mischenZusammenfassung – Listen-Organizer4Fortgeschrittene Map-Manipulation
Über eine Map iterierenPrüfen auf Schlüssel und WerteMap-Eigenschaften: keys & valuesBedingtes Hinzufügen: putIfAbsentEinträge aus einer Map entfernenVerschachtelte MapsRückblick – Inventar-Update7Fortgeschrittene Funktionen
Anonyme FunktionenFunktionen als Argumente übergebenClosures verstehenEinführung in die RekursionRekursive Funktion: CountdownRekursive Funktion: FakultätZusammenfassung – List Processor10Abschluss-Herausforderungen
Herausforderung: NotensortiererHerausforderung: VokalzählerHerausforderung: FizzBuzz2Funktionale Listenoperationen
Transformieren mit 'map'Filtern mit 'where''.toList()' verwendenBedingungen prüfen mit 'any'Bedingungen mit 'every'Suchen mit 'firstWhere'Zusammenfassung – Datenfilterung3Sets
Was ist ein Set?Ein Set erstellenHinzufügen und Entfernen in SetsPrüfen auf Elemente in einem SetEine Liste in ein Set umwandelnSet-VereinigungSet-SchnittmengeSet-DifferenzRückblick – Einzigartige Gästeliste6Grundlagen der Fehlerbehandlung
Was sind Exceptions?Der 'try-catch'-BlockExceptions mit 'on' abfangenDer 'finally'-BlockEine Exception auslösenRückblick - Sichere Division