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

Задание

Легко

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

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

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

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

Для ввода 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