Что такое исключение?
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 43 из 56.
Когда во время выполнения что-то идет не так — деление на ноль, парсинг "abc" как целого числа, вызов метода у nil: Ruby генерирует исключение. Программа останавливается, и Ruby выводит информацию о том, что произошло и где это случилось.
10 / 0
# ZeroDivisionError: деление на 0Каждый вид ошибки представляет собой отдельный класс. Несколько распространенных:
ZeroDivisionError: деление целого числа на нольArgumentError: методу переданы неверные аргументы (Integer("abc"))
NoMethodError: вызов метода, которого нет у получателя (nil.upcase)TypeError: операция над объектом неподходящего типа ("a" + 1)
У каждого класса исключения есть .message: понятное человеку описание, которое Ruby выводит, когда исключение не обработано. В следующих уроках показано, как перехватывать эти исключения, чтобы ваша программа продолжала работать.
Задание
НовичокПрочитайте одну строку ввода — название выражения Ruby. Выведите имя класса исключения, которое Ruby сгенерировал бы для него. Используйте оператор case (реальное возбуждение исключения не требуется):
divide-by-zero→ZeroDivisionErrornil-method→NoMethodErrorbad-integer→ArgumentErrorwrong-type→TypeError- все остальное →
Unknown
Для ввода nil-method результатом будет NoMethodError.
Шпаргалка
Когда во время выполнения что-то идет не так, Ruby генерирует исключение, и программа останавливается. Распространенные классы исключений:
ZeroDivisionError: деление целого числа на нольArgumentError: неверные аргументы (например,Integer("abc"))NoMethodError: вызов метода, которого нет у получателя (например,nil.upcase)TypeError: операция над объектом неподходящего типа (например,"a" + 1)
10 / 0
# ZeroDivisionError: деление на 0У каждого объекта исключения есть метод .message с человекочитаемым описанием.
Попробуйте сами
kind = gets.chomp
# TODO: case kind ... вывести соответствующее имя класса исключения
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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Итоги — Безопасный калькулятор