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: подставить значение по умолчанию, залогировать проблему или повторно запросить данные у пользователя.
Задание
ЛегкоПрочитайте две строки из входных данных, обе должны быть целыми числами, но вторая может оказаться некорректным числом.
Оберните парсинг второй строки в 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!"
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор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Итоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваИтерация по двумерным массивамРаспространенные 2D-паттерныИтоги: Операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книги9Обработка ошибок
Что такое исключение?begin / rescueМножественные блоки rescueensure и raiseИтоги — Безопасный калькулятор