Spec-Zone.ru › Ruby 2.3

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

Исключения обрабатываются в блоке begin/end.

begin
  # code that might raise
rescue
  # handle exception
end

Если вы находитесь внутри метода, вам не нужно использовать begin или end, если вы не хотите ограничить область действия обрабатываемых исключений:

def my_method
  # ...
rescue
  # ...
end

То же самое относится к class или module.

Вы можете назначить исключение локальной переменной, используя => variable_name в конце строки rescue:

begin
  # ...
rescue => exception
  warn exception.message
  raise # re-raise the current exception
end

По умолчанию, StandardError и его подклассы обрабатываются. Вы можете обработать определённый набор классов исключений (и их подклассы), перечислив их после rescue:

begin
  # ...
rescue ArgumentError, NameError
  # handle ArgumentError or NameError
end

Вы можете обрабатывать разные типы исключений по-разному:

begin
  # ...
rescue ArgumentError
  # handle ArgumentError
rescue NameError
  # handle NameError
rescue
  # handle any StandardError
end

Исключение сопоставляется с блоком обработки, начиная с самого верхнего, и сопоставляется только один раз. Если в блоке begin произойдёт исключение ArgumentError, оно не будет обработано в блоке StandardError.

Вы можете повторить попытку обработки исключений:

begin
  # ...
rescue
  # do something that may change the result of the begin block
  retry
end

Выполнение возобновится в начале блока begin, поэтому будьте осторожны, чтобы не создать бесконечный цикл.

Внутри блока обработки — единственное допустимое место для retry, все остальные использования приведут к исключению SyntaxError. Если вы хотите повторить итерацию блока, используйте redo. Подробности см. в Управляющих выражениях.

Чтобы всегда выполнить некоторый код, независимо от того, было ли выброшено исключение или нет, используйте ensure:

begin
  # ...
rescue
  # ...
ensure
  # this always runs
end

Вы также можете выполнить некоторый код, когда исключение не происходит:

begin
  # ...
rescue
  # ...
else
  # this runs only when no exception was raised
ensure
  # ...
end

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API