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!.
Попробуйте сами
a = gets.to_i
raw_b = gets.chomp
# TODO: begin/rescue вокруг Integer(raw_b); вывести сумму или точный текст из инструкций
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Итоги — Безопасный калькуляторПотренируйтесь самостоятельно: Онлайн-компилятор Ruby