kbook


Project maintained by atilla777 Hosted on GitHub Pages — Theme by mattgraham
Главная страница
Ruby

Обработка исключений

Структура кода обработки исключений

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