Przechwytywanie wyjątków za pomocą „on”
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 40 z 65.
Podczas gdy podstawowy blok try-catch przechwytuje każdy występujący wyjątek, czasami trzeba obsługiwać różne typy wyjątków na różne sposoby. Słowo kluczowe on pozwala przechwytywać określone typy wyjątków i zapewniać dla każdego z nich odpowiednią reakcję.
Zamiast przechwytywać wszystkie wyjątki za pomocą ogólnego catch, możesz obsługiwać konkretne wyjątki, używając on, po którym podajesz typ wyjątku. Dzięki temu masz większą kontrolę nad tym, jak twój program reaguje na różne sytuacje błędów.
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}W tym przykładzie kod przechwytuje konkretnie wyjątek FormatException, który występuje podczas próby sparsowania nieprawidłowego tekstu jako liczby. Dzięki temu możesz wyświetlić jasny, przyjazny dla użytkownika komunikat, który bezpośrednio odnosi się do problemu, zamiast pokazywać ogólny komunikat o błędzie, który mógłby wprowadzić użytkowników w błąd.
Możesz też łączyć wiele bloków on, aby obsługiwać różne typy wyjątków za pomocą odpowiednich reakcji, dzięki czemu obsługa błędów będzie zarówno precyzyjna, jak i przyjazna dla użytkownika.
Wyzwanie
ŁatwyUtwórz program demonstrujący przechwytywanie konkretnych wyjątków za pomocą słowa kluczowego on. Program będzie przetwarzać różne typy danych wejściowych od użytkownika i obsługiwać konkretne typy wyjątków za pomocą odpowiednio dobranych komunikatów o błędach.
- Odczytaj dane wejściowe będące ciągiem znaków określającym typ wyrażenia matematycznego (
"parse","divide"lub"access") - Odczytaj dane wejściowe będące ciągiem znaków reprezentującym pierwszą wartość
- Odczytaj dane wejściowe będące ciągiem znaków reprezentującym drugą wartość (jeśli ma zastosowanie)
- W zależności od typu wyrażenia wykonaj odpowiednią operację, stosując obsługę konkretnych wyjątków:
- Dla
"parse": skonwertuj pierwszą wartość na liczbę całkowitą za pomocąint.parse()i przechwyć konkretnieFormatException - Dla
"divide": sparsuj obie wartości jako liczby całkowite i wykonaj dzielenie, przechwytującFormatExceptionw przypadku błędów parsowania - Dla
"access": utwórz listę z pierwszą wartością i uzyskaj dostęp do indeksu określonego przez drugą wartość, przechwytującRangeErrorw przypadku nieprawidłowych indeksów - Wyświetl wyniki lub konkretne komunikaty o błędach dokładnie w formacie pokazanym poniżej
Na przykład, jeśli danymi wejściowymi są "parse", "42", "unused", program powinien wyświetlić:
Operation: parse
Input: 42
Parsing successful!
Result: 42Jeśli danymi wejściowymi są "parse", "xyz", "unused", program powinien wyświetlić:
Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integerJeśli danymi wejściowymi są "divide", "10", "2", program powinien wyświetlić:
Operation: divide
Values: 10, 2
Division successful!
Result: 5Jeśli danymi wejściowymi są "divide", "10", "abc", program powinien wyświetlić:
Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbersJeśli danymi wejściowymi są "access", "hello", "1", program powinien wyświetlić:
Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0Program musi używać oddzielnych bloków try-catch ze słowem kluczowym on, aby przechwytywać konkretnie FormatException i RangeError. Każdy typ wyjątku powinien mieć własny, odpowiednio dobrany komunikat o błędzie, który jasno wyjaśnia, co poszło nie tak. W przypadku operacji "access" utwórz listę zawierającą wyłącznie pierwszą wartość wejściową i spróbuj uzyskać dostęp do indeksu określonego przez drugą wartość wejściową.
Spróbuj swoich sił
import 'dart:io';
void main() {
// Odczytaj dane wejściowe
String? operation = stdin.readLineSync();
String? firstValue = stdin.readLineSync();
String? secondValue = stdin.readLineSync();
// Wyświetl informacje o operacji
print('Operation: $operation');
// TODO: Napisz swój kod poniżej
// Użyj bloków try-catch ze słowem kluczowym 'on', aby obsłużyć określone wyjątki
// Obsłuż FormatException dla operacji parse i divide
// Obsłuż RangeError dla operacji access
}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