Exception Обработка исключений
Исключения обрабатываются в блоке begin/end:
begin # code that might raise rescue # handle exception end
Если вы находитесь внутри метода, вам не нужно использовать begin или end, если вы не хотите ограничить область действия обработанных исключений:
def my_method # ... rescue # ... end
То же самое относится к class, module, и block:
[0, 1, 2].map do |i| 10 / i rescue ZeroDivisionError nil end #=> [nil, 10, 5]
Вы можете присвоить исключение локальной переменной, используя => 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`, поэтому будьте внимательны, чтобы не создать бесконечный цикл.
Внутри блока `rescue` — единственное допустимое место для 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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.