Menu
Coddy logo textTech

Несколько клауз 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

Используйте это, когда код восстановления одинаков для нескольких режимов сбоя.

challenge icon

Задание

Легко

Прочитайте две строки из input, обе должны быть целыми числами. Используйте Integer(...) для обеих строк, затем разделите первое число на второе.

Обработайте три случая с отдельными ветвями rescue:

  • ArgumentError → выведите Bad number!
  • ZeroDivisionError → выведите Cannot divide by zero!
  • TypeError → выведите Wrong type!

Если всё работает, выведите Result: <a / b> (целочисленное деление).

Для input 10 / 2 результатом будет Result: 5. Для 10 / 0Cannot divide by zero!. Для 10 / abcBad number!.

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

raw_a = gets.chomp
raw_b = gets.chomp

# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby