Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Utwó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.

  1. Odczytaj dane wejściowe będące ciągiem znaków określającym typ wyrażenia matematycznego ("parse", "divide" lub "access")
  2. Odczytaj dane wejściowe będące ciągiem znaków reprezentującym pierwszą wartość
  3. Odczytaj dane wejściowe będące ciągiem znaków reprezentującym drugą wartość (jeśli ma zastosowanie)
  4. 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ć konkretnie FormatException
    • Dla "divide": sparsuj obie wartości jako liczby całkowite i wykonaj dzielenie, przechwytując FormatException w 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ąc RangeError w przypadku nieprawidłowych indeksów
  5. 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: 42

Jeś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 integer

Jeśli danymi wejściowymi są "divide", "10", "2", program powinien wyświetlić:

Operation: divide
Values: 10, 2
Division successful!
Result: 5

Jeś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 numbers

Jeś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 0

Program 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
  
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Dart online