Menu
Coddy logo textTech

begin / rescue

Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 44 из 56.

Чтобы исключение не привело к аварийному завершению программы, оберните рискованный код в begin ... rescue ... end. Если внутри begin возникает ошибка, Ruby переходит к соответствующему блоку rescue вместо завершения работы.

begin
  result = 10 / 0
  puts result
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end
# Нельзя делить на ноль!

Вы можете получить сам объект исключения с помощью => e и прочитать его .message:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end
# Некорректный ввод: недопустимое значение для Integer(): "hello"

Если вы не укажете класс исключения, rescue сам по себе перехватывает StandardError и его потомков, то есть большинство повседневных ошибок. Перехват наиболее полезен, когда вы можете что-то сделать в блоке rescue: подставить значение по умолчанию, залогировать проблему или повторно запросить данные у пользователя.

challenge icon

Задание

Легко

Прочитайте две строки из входных данных, обе должны быть целыми числами, но вторая может оказаться некорректным числом.

Оберните парсинг второй строки в begin / rescue:

  • Используйте Integer(input) (который вызывает ArgumentError при некорректной строке)
  • Если парсинг прошел успешно, выведите Sum: <a + b>
  • Если произошла ошибка, выведите Bad number!

Для входных данных 3, а затем 4, результатом будет Sum: 7. Для 3, а затем abc, результатом будет Bad number!.

Шпаргалка

Используйте begin ... rescue ... end для обработки исключений без аварийного завершения программы:

begin
  result = 10 / 0
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end

Перехватывайте объект исключения с помощью => e для доступа к его сообщению:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end

Использование rescue без указания класса перехватывает StandardError и его потомков.

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

a = gets.to_i
raw_b = gets.chomp

# TODO: использовать begin/rescue для Integer(raw_b); вывести сумму или "Bad number!"
quiz iconПроверьте себя

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

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