Несколько клауз 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Используйте это, когда код восстановления одинаков для нескольких режимов сбоя.
Задание
ЛегкоПрочитайте две строки из input, обе должны быть целыми числами. Используйте Integer(...) для обеих строк, затем разделите первое число на второе.
Обработайте три случая с отдельными ветвями rescue:
ArgumentError→ выведитеBad number!ZeroDivisionError→ выведитеCannot divide by zero!TypeError→ выведитеWrong type!
Если всё работает, выведите Result: <a / b> (целочисленное деление).
Для input 10 / 2 результатом будет Result: 5. Для 10 / 0 — Cannot divide by zero!. Для 10 / abc — Bad number!.
Попробуйте сами
raw_a = gets.chomp
raw_b = gets.chomp
# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки: подробный разбор
Обзор методов строкИнтерполяция строкПеребор строкРазделение и объединениеПовторение — String Weaver4Блоки, Proc и Lambda
Что такое блок?do..end и фигурные скобкиКлючевое слово yieldПараметры блокаProc и LambdaПовторение — пользовательский итератор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Повторение — конвейер данных3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваПеребор двумерных массивовРаспространённые шаблоны для двумерных массивовПовторение — операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книги9Обработка ошибок
Что такое исключение?begin / rescueНесколько клауз rescueensure и raiseПовторение — безопасный калькуляторПотренируйтесь самостоятельно: Онлайн-компилятор Ruby