Множественные блоки rescue
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 45 из 56.
Один блок begin может иметь несколько секций rescue. Ruby проверяет их сверху вниз и выполняет первую из них, класс исключения которой совпадает.
begin
number = Integer(gets.chomp)
result = 100 / number
puts result
rescue ArgumentError
puts "That's not a valid number."
rescue ZeroDivisionError
puts "Can't divide by zero."
endПорядок имеет значение: перечисляйте специфические классы перед общими. StandardError, помещенный первым, поглотит всё, и последующие ветки никогда не будут выполнены.
Вы также можете перехватывать несколько классов исключений в одной ветке, перечислив их через запятую:
begin
risky_call
rescue ArgumentError, TypeError => e
puts "Bad input: #{e.message}"
endИспользуйте это, когда код восстановления одинаков для нескольких режимов сбоя.
Задание
ЛегкоПрочитайте две строки из входных данных, обе должны быть целыми числами. Используйте Integer(...) для обеих, затем разделите первое число на второе.
Обработайте три случая с помощью отдельных веток rescue:
ArgumentError→ выведитеBad number!ZeroDivisionError→ выведитеCannot divide by zero!TypeError→ выведитеWrong type!
Если всё работает правильно, выведите Result: <a / b> (целочисленное деление).
Для входных данных 10 / 2 результатом будет Result: 5. Для 10 / 0 — Cannot divide by zero!. Для 10 / abc — Bad number!.
Шпаргалка
Блок begin может иметь несколько веток rescue — Ruby сопоставляет их сверху вниз:
begin
number = Integer(gets.chomp)
result = 100 / number
puts result
rescue ArgumentError
puts "That's not a valid number."
rescue ZeroDivisionError
puts "Can't divide by zero."
endПеречисляйте конкретные классы исключений перед общими — общий класс, такой как StandardError, помещенный первым, поглотит все последующие ветки.
Перехватывайте несколько классов исключений в одной ветке, разделяя их запятыми:
rescue ArgumentError, TypeError => e
puts "Bad input: #{e.message}"Попробуйте сами
raw_a = gets.chomp
raw_b = gets.chomp
# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор7Хеши. Часть 2
Hash.new со значениями по умолчаниюИтерация по хешамВложенные хешиСлияние и преобразованиеИтоги — счетчик частоты10Проект — Учёт студентов
Обзор проектаДобавить студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика по диапазонам5Мощь Enumerable
Select и RejectЦепочки MapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byИтоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваИтерация по двумерным массивамРаспространенные 2D-паттерныИтоги: Операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книги9Обработка ошибок
Что такое исключение?begin / rescueМножественные блоки rescueensure и raiseИтоги — Безопасный калькулятор