Exceptions mit 'on' abfangen
Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy — Lektion 40 von 65.
Während der grundlegende try-catch-Block jede auftretende Exception abfängt, müssen Sie manchmal verschiedene Arten von Exceptions auf unterschiedliche Weise behandeln. Das Schlüsselwort on ermöglicht es Ihnen, spezifische Exception-Typen abzufangen und für jeden maßgeschneiderte Reaktionen bereitzustellen.
Anstatt alle Ausnahmen mit einem generischen catch abzufangen, können Sie gezielt bestimmte Ausnahmen mit on gefolgt vom Ausnahmetyp ansprechen. Dies gibt Ihnen mehr Kontrolle darüber, wie Ihr Programm auf verschiedene Fehlersituationen reagiert.
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}In diesem Beispiel fängt der Code gezielt eine FormatException ab, die auftritt, wenn versucht wird, ungültigen Text als Zahl zu parsen. Dies ermöglicht es Ihnen, eine klare, benutzerfreundliche Nachricht bereitzustellen, die das Problem direkt anspricht, anstatt eine generische Fehlermeldung anzuzeigen, die Benutzer verwirren könnte.
Sie können auch mehrere on-Blöcke kombinieren, um verschiedene Ausnahmetypen mit angemessenen Antworten zu behandeln, wodurch Ihre Fehlerbehandlung sowohl präzise als auch benutzerfreundlich wird.
Aufgabe
EinfachErstellen Sie ein Programm, das das Abfangen spezifischer Ausnahmen mit dem Schlüsselwort on demonstriert. Ihr Programm wird verschiedene Arten von Benutzereingaben verarbeiten und spezifische Ausnahmetypen mit maßgeschneiderten Fehlermeldungen behandeln.
- Lesen Sie eine String-Eingabe ein, die einen mathematischen Ausdruckstyp darstellt (
"parse","divide"oder"access") - Lesen Sie eine String-Eingabe ein, die den ersten Wert darstellt
- Lesen Sie eine String-Eingabe ein, die den zweiten Wert darstellt (falls zutreffend)
- Führen Sie basierend auf dem Ausdruckstyp die entsprechende Operation unter Verwendung spezifischer Ausnahmebehandlung aus:
- Für
"parse": Konvertieren Sie den ersten Wert mitint.parse()in eine Ganzzahl und fangen Sie gezielt dieFormatExceptionab - Für
"divide": Parsen Sie beide Werte als Ganzzahlen und führen Sie eine Division durch, wobei Sie dieFormatExceptionfür Parsing-Fehler abfangen - Für
"access": Erstellen Sie eine Liste mit dem ersten Wert und greifen Sie auf den durch den zweiten Wert angegebenen Index zu, wobei SieRangeErrorfür ungültige Indizes abfangen - Zeigen Sie die Ergebnisse oder spezifischen Fehlermeldungen in dem unten gezeigten exakten Format an
Wenn die Eingaben beispielsweise "parse", "42", "unused" sind, sollte Ihr Programm Folgendes ausgeben:
Operation: parse
Input: 42
Parsing successful!
Result: 42Wenn die Eingaben "parse", "xyz", "unused" sind, sollte Ihr Programm Folgendes ausgeben:
Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integerWenn die Eingaben "divide", "10", "2" sind, sollte Ihr Programm Folgendes ausgeben:
Operation: divide
Values: 10, 2
Division successful!
Result: 5Wenn die Eingaben "divide", "10", "abc" sind, sollte Ihr Programm Folgendes ausgeben:
Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbersWenn die Eingaben "access", "hello", "1" sind, sollte Ihr Programm Folgendes ausgeben:
Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0Ihr Programm muss separate try-catch-Blöcke mit dem Schlüsselwort on verwenden, um FormatException und RangeError gezielt abzufangen. Jeder Ausnahmetyp sollte eine eigene, maßgeschneiderte Fehlermeldung haben, die klar erklärt, was schiefgelaufen ist. Erstellen Sie für die Operation "access" eine Liste, die nur den ersten Eingabewert enthält, und versuchen Sie, auf den durch den zweiten Eingabewert angegebenen Index zuzugreifen.
Spickzettel
Verwenden Sie das Schlüsselwort on, um spezifische Ausnahmetypen abzufangen, anstatt einen generischen catch-Block zu verwenden:
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}Sie können mehrere on-Blöcke kombinieren, um verschiedene Ausnahmetypen mit entsprechenden Reaktionen zu behandeln:
try {
// Code, der verschiedene Ausnahmen auslösen könnte
} on FormatException {
print("Invalid format error");
} on RangeError {
print("Index out of range error");
}Dieser Ansatz bietet mehr Kontrolle über die Fehlerbehandlung, indem er maßgeschneiderte Reaktionen für jeden spezifischen Ausnahmetyp ermöglicht.
Probier es selbst
import 'dart:io';
void main() {
// Eingabe lesen
String? operation = stdin.readLineSync();
String? firstValue = stdin.readLineSync();
String? secondValue = stdin.readLineSync();
// Operationsinformationen anzeigen
print('Operation: $operation');
// TODO: Schreiben Sie Ihren Code unten
// Verwenden Sie try-catch-Blöcke mit dem Schlüsselwort 'on', um spezifische Ausnahmen zu behandeln
// Behandeln Sie FormatException für Parse- und Divisionsoperationen
// Behandeln Sie RangeError für Zugriffsoperationen
}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