Для ошибочного завершения операции обычно используют raise и обрабатывают конкретное исключение на подходящей границе через rescue. ensure предназначен для освобождения ресурсов при выходе из блока. exit и abort затрагивают весь процесс, а не отдельный модуль. Асинхронный Thread#raise опасен для целостности состояния; для штатной отмены предпочтительнее согласованный сигнал.
Как прервать выполнение отдельной операции в Ruby?
Исключение прерывает текущую операцию, а exit завершает процесс. Объясняем границы rescue, ensure и безопасную отмену работы потока.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Важно различать прерывание операции и завершение процесса. Чтобы сообщить об ошибке внутри метода, Ruby позволяет вызвать raise; вызывающий код решает, как её обработать.
class InvalidQuantity < StandardError; end
def total(quantity, price)
raise InvalidQuantity, 'Количество должно быть положительным' if quantity <= 0
quantity * price
end
begin
puts total(0, 100)
rescue InvalidQuantity => error
warn error.message
end
Перехватывать стоит ошибки, для которых есть осмысленный сценарий восстановления. Пустой rescue скрывает проблему; слишком широкий rescue Exception может захватить системные события. Для освобождения ресурсов используют ensure или блочные API вроде File.open.
exit инициирует завершение процесса через SystemExit, abort дополнительно выводит сообщение об ошибке. exit! завершает процесс немедленно, обходя обычные обработчики завершения. Поэтому ни exit!, ни принудительное уничтожение процесса нельзя сочетать с обещанием «ensure выполнится всегда». Kernel: исключения и завершение
Внешние сигналы относятся к управлению процессом. Thread#raise внедряет исключение в другой поток, но может застать его посреди изменения общих данных. Для штатной отмены лучше заранее спроектировать протокол: например, передавать сообщение остановки через потокобезопасную очередь и проверять его между операциями. Предупреждение о Thread#raise
Синтаксическая ошибка или бесконечный цикл — не механизм управляемой отмены. Тестовые assertions выявляют нарушения ожиданий, но также не заменяют контракт обработки ошибок рабочего приложения.