Menu
Coddy logo textTech

Перехват исключений с помощью 'on'

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 40 из 65.

Хотя базовый блок try-catch перехватывает любое возникающее исключение, иногда вам нужно обрабатывать различные типы исключений по-разному. Ключевое слово on позволяет перехватывать определенные типы исключений и предоставлять индивидуальную обработку для каждого из них.

Вместо того чтобы перехватывать все исключения с помощью универсального catch, вы можете нацелиться на конкретные исключения, используя on, за которым следует тип исключения. Это дает вам больше контроля над тем, как ваша программа реагирует на различные ошибочные ситуации.

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

В этом примере код специально перехватывает FormatException, которое возникает при попытке преобразовать некорректный текст в число. Это позволяет вывести понятное и удобное для пользователя сообщение, которое напрямую указывает на проблему, вместо того чтобы показывать стандартное сообщение об ошибке, которое может запутать пользователей.

Вы также можете комбинировать несколько блоков on для обработки различных типов исключений с соответствующими ответами, что делает вашу обработку ошибок точной и удобной для пользователя.

challenge icon

Задание

Легко

Создайте программу, которая демонстрирует перехват определенных исключений с использованием ключевого слова on. Ваша программа будет обрабатывать различные типы пользовательского ввода и обрабатывать конкретные типы исключений с помощью адаптированных сообщений об ошибках.

  1. Прочитайте строковый ввод, представляющий тип математического выражения ("parse", "divide" или "access")
  2. Прочитайте строковый ввод, представляющий первое значение
  3. Прочитайте строковый ввод, представляющий второе значение (если применимо)
  4. В зависимости от типа выражения выполните соответствующую операцию, используя специфическую обработку исключений:
    • Для "parse": Преобразуйте первое значение в целое число с помощью int.parse() и перехватите именно FormatException
    • Для "divide": Преобразуйте оба значения в целые числа и выполните деление, перехватывая FormatException для ошибок парсинга
    • Для "access": Создайте список с первым значением и обратитесь к индексу, указанному вторым значением, перехватывая RangeError для недопустимых индексов
  5. Выведите результаты или конкретные сообщения об ошибках в точном формате, показанном ниже

Например, если входные данные — "parse", "42", "unused", ваша программа должна вывести:

Operation: parse
Input: 42
Parsing successful!
Result: 42

Если входные данные — "parse", "xyz", "unused", ваша программа должна вывести:

Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integer

Если входные данные — "divide", "10", "2", ваша программа должна вывести:

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

Если входные данные — "divide", "10", "abc", ваша программа должна вывести:

Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbers

Если входные данные — "access", "hello", "1", ваша программа должна вывести:

Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0

Ваша программа должна использовать отдельные блоки try-catch с ключевым словом on для перехвата именно FormatException и RangeError. Каждый тип исключения должен иметь свое собственное адаптированное сообщение об ошибке, которое четко объясняет, что пошло не так. Для операции "access" создайте список, содержащий только первое входное значение, и попытайтесь получить доступ к индексу, указанному вторым входным значением.

Шпаргалка

Используйте ключевое слово on для перехвата определенных типов исключений вместо использования универсального блока catch:

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

Вы можете комбинировать несколько блоков on для обработки различных типов исключений с соответствующими ответами:

try {
  // некоторый код, который может вызвать различные исключения
} on FormatException {
  print("Invalid format error");
} on RangeError {
  print("Index out of range error");
}

Этот подход обеспечивает больший контроль над обработкой ошибок, позволяя настраивать ответы для каждого конкретного типа исключения.

Попробуйте сами

import 'dart:io';

void main() {
  // Чтение ввода
  String? operation = stdin.readLineSync();
  String? firstValue = stdin.readLineSync();
  String? secondValue = stdin.readLineSync();
  
  // Отображение информации об операции
  print('Operation: $operation');
  
  // TODO: Напишите свой код ниже
  // Используйте блоки try-catch с ключевым словом 'on' для обработки конкретных исключений
  // Обработайте FormatException для операций parse и divide
  // Обработайте RangeError для операции access
  
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком