Ruby /

Exceptions

Исключение в Ruby - это объект, который создается, когда возникает ошибка, и передается вверх по стеку вызовов до тех пор, пока программа не найдет блок, который сможет его обработать. Если подходящий блок обработки не найден, программа завершает выполнение, выводя сообщение об ошибке и трассировку стека.

Для обработки исключений используется конструкция begin-rescue, которая позволяет перехватывать ошибки и определять, как их обрабатывать.

begin
# Код, который может вызвать исключение
rescue ExceptionType
# Код для обработки исключения
end

ExceptionType здесь, это класс объекта исключения. Класс Exception имеет следующие основные подклассы -

Exception
NoMemoryError
ScriptError
LoadError
NotImplementedError
SyntaxError
SignalException
Interrupt
StandardError
ArgumentError
LocalJumpError
NameError
NoMethodError
RuntimeError
SystemCallError
SystemStackError
TypeError
SystemExit

Возникновение ошибок конкретного класса также приводит к возникновению ошибок его дочерних классов. При обработке исключений класса StandardError обрабатываются не только исключения, относящиеся к классу StandardError, но и исключения его дочерних классов.

Это означает, что если возникает ArgumentError, то можно его обработать через StandardError.

begin
do_something

raise ArgumentError
rescue StandardError => e
puts e # =>ArgumentError

do_something_else
end

Но это является плохой практикой. Всегда нужно стараться обрабатывать конкретные исключения.

begin
do_something

raise ArgumentError
rescue ArgumentError
do_something_else
rescue NoMethodError
do_something_else_2
end