Menu
Coddy logo textTech

ensure и raise

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

Ещё два элемента дополняют инструментарий обработки ошибок.

ensure — это блок, который выполняется несмотря ни на что: независимо от того, завершился ли begin нормально, перехватила ли ветка rescue исключение или исключение вообще осталось необработанным. Именно здесь размещают код очистки:

begin
  puts "opening file"
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "closing file"
end
# открытие файла
# поймал это
# закрытие файла

raise используется для создания собственного исключения. Передайте строку для message или class вместе с message:

def withdraw(amount)
  raise ArgumentError, "amount must be positive" if amount <= 0
  # ... выполнить снятие
end

Принято выполнять raise заранее, в начале метода, чтобы быстро завершать выполнение при неверных аргументах. Вызывающий код может выполнить rescue, если у него есть разумный способ восстановления, или позволить ошибке всплыть выше.

challenge icon

Задание

Легко

Определите метод safe_divide(a, b), который:

  • вызывает ArgumentError с сообщением "b cannot be zero", если b == 0
  • иначе возвращает a / b

Затем прочитайте из ввода два целых числа. Вызовите safe_divide внутри begin / rescue / ensure:

  • при успехе выведите Result: <value>
  • при возникновении ArgumentError выведите Error: <message>
  • в ensure всегда выводите Done.

Для ввода 10 / 2 результатом будет:

Result: 5
Done.

Для ввода 10 / 0:

Error: b cannot be zero
Done.

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

# TODO: определите safe_divide(a, b), вызывает ArgumentError, когда b == 0

a = gets.to_i
b = gets.to_i

# TODO: begin ... вывести Result; rescue ArgumentError => e ... вывести Error; ensure ... вывести Done.
quiz iconПроверьте себя

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

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

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