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!.

Шпаргалка

Блок 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
quiz iconПроверьте себя

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

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