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