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, если у него есть разумный способ восстановления, или позволить ошибке всплыть выше.
Задание
ЛегкоОпределите метод 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.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки: подробный разбор
Обзор методов строкИнтерполяция строкПеребор строкРазделение и объединениеПовторение — String Weaver4Блоки, Proc и Lambda
Что такое блок?do..end и фигурные скобкиКлючевое слово yieldПараметры блокаProc и LambdaПовторение — пользовательский итератор7Хэши, часть 2
Hash.new со значениями по умолчаниюПеребор хэшейВложенные хэшиОбъединение и преобразованиеПовторение — счётчик частот10Проект — Учёт студентов
Обзор проектаДобавление студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика с диапазонами5Мощь Enumerable
Select и RejectЦепочка вызовов mapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byПовторение — конвейер данных3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваПеребор двумерных массивовРаспространённые шаблоны для двумерных массивовПовторение — операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книги9Обработка ошибок
Что такое исключение?begin / rescueНесколько клауз rescueensure и raiseПовторение — безопасный калькуляторПотренируйтесь самостоятельно: Онлайн-компилятор Ruby