Структура кода обработки исключений
begin
# код в котором контролируется появление исключений
rescue Исключение
# код выполняемый при возникновении исключения
else
# код выполняемый при отсутствии исключения
ensure
# код выполняемый всегда
end
Если параметр Исключение в rescue не задан, то по умолчанию будут отлавливаться ошибка класса StandardError.
Если в качестве параметра rescue указать Exception, то будут перехватываться все исключения (Exception является родительским классом для всех остальных классов исключений).
В приложении рекомендуется перехватывать только StandardError, так как нет смысла обрабатывать ошибки, делающие невозможным дальнейшее исполнение кода, т.е. ошибки синтаксиса, прерывания и т.п. (т.е. все Exception) в приложении.
Для того что бы передать сведения об исключении (например, для вывода соответствующего сообщения пользователю) в код выполняемые в rescue используется следующая конструкция
begin
# код
rescue Исключение => переменная
# код исключения, использующий переменную
end
Если одни и те же исключения обрабатываются несколько раз, то их обработку лучше обернуть в метод:
def метод
yield
rescue IOError
# код обработки ошибки класса IOError
end
метод { контролируемый код }
В Ruby catch и throw используются для перехода от места вызова throw к выполнению кода, следующего за концом блока catch (аналог goto):
catch :метка do
# код1
throw :метка if условие
# код2
end
# код3 - если сработает throw, то вместо кода 2 будет выполнен код3
Выполнение кода, обрабатывающего прерывание, вызванное нажатием клавиш Ctrl + C
begin
код
rescue Interrupt => _
код обработки исключения
end