Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
raise ArgumentError, "Неверные данные" # Пример 4raise ArgumentError.new("Неверные данные ") # Пример 5raise ArgumentError, " Неверные данные ", caller[0] # Пример 6В первом примере повторно возбуждается последнее встретившееся исключение. В примере 2 создается исключение
RuntimeError"Произошла ошибка"В примере 3 возбуждается исключение типа
ArgumentError"Неверные данные""filename:line""filename:line:in 'method'"callerА как обрабатываются исключения в Ruby? Для этой цели служит блок
begin-endbegin #Ничего полезного. #...endПросто перехватывать ошибки не очень осмысленно. Но у блока может быть один или несколько обработчиков
rescuebeginrescuerescuebegin x = Math.sqrt(y/z) # ...rescue ArgumentError puts "Ошибка при извлечении квадратного корня."rescue ZeroDivisionError puts "Попытка деления на нуль."endТого же эффекта можно достичь следующим образом:
begin x = Math.sqrt(y/z) # ...rescue => err puts errendЗдесь в переменной
errrescuetandardErrorrescue => variable=>Если типы ошибок указаны, то может случиться так, что тип реально возникшего исключения не совпадает ни с одним из них. На этот случай после всех обработчиков
rescueelsebegin # Код, в котором может возникнуть ошибка...rescue Type1 # ...rescue Type2 # ...else #Прочие исключения...endЧасто мы хотим каким-то образом восстановиться после ошибки. В этом поможет ключевое слово
retryrescuebeginbegin # Код, в котором может возникнуть ошибка...rescue # Пытаемся восстановиться... retry # Попробуем еще раз.endНаконец, иногда необходим код, который «подчищает» что-то после выполнения блока
begin-endensurebegin # Код, в котором может возникнуть ошибка...rescue # Обработка исключений.ensure # Этот код выполняется в любом случае.endКод, помещенный внутрь части
ensurebegin-endИсключения можно перехватывать еще двумя способами. Во-первых, существует форма
rescuex = a/b rescue puts("Деление на нуль!")Кроме того, тело определения метода представляет собой неявный блок
begin-endbeginenddef some_method # Код...rescue # Восстановление после ошибки...endНа этом мы завершаем как обсуждение обработки исключений, так и рассмотрение основ синтаксиса и семантики в целом.
У Ruby есть многочисленные аспекты, которых мы не коснулись. Оставшаяся часть главы посвящена более развитым возможностям языка, в том числе рассмотрению ряда практических приемов, которые помогут программисту среднего уровня научиться «думать на Ruby».
1.3. ООП в Ruby
В языке Ruby есть все элементы, которые принято ассоциировать с объектно-ориентированными языками: объекты с инкапсуляцией и сокрытием данных, методы с полиморфизмом и переопределением, классы с иерархией и наследованием. Но Ruby идет дальше, добавляя ограниченные возможности создания метаклассов, синглетные методы, модули и классы-примеси.
Похожие идеи, только под иными именами, встречаются и в других объектно-ориентированных языках, но одно и то же название может скрывать тонкие различия. В этом разделе мы уточним, что в Ruby понимается под каждым из элементов ООП.
