Как прервать выполнение отдельной операции в Ruby?

Исключение прерывает текущую операцию, а exit завершает процесс. Объясняем границы rescue, ensure и безопасную отмену работы потока.

Короткий ответ

Что ответить на собеседовании

Для ошибочного завершения операции обычно используют raise и обрабатывают конкретное исключение на подходящей границе через rescue. ensure предназначен для освобождения ресурсов при выходе из блока. exit и abort затрагивают весь процесс, а не отдельный модуль. Асинхронный Thread#raise опасен для целостности состояния; для штатной отмены предпочтительнее согласованный сигнал.

Подробный разбор

Ответ с пояснениями

Важно различать прерывание операции и завершение процесса. Чтобы сообщить об ошибке внутри метода, 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 выявляют нарушения ожиданий, но также не заменяют контракт обработки ошибок рабочего приложения.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку