Подтвердить что ты не робот

В чем разница между выходом и прерыванием?

В документации abort указано abort будет

Завершить выполнение немедленно, эффективно, вызвав Kernel.exit(false).

Что именно означает "сразу"? В чем разница между abort и exit с статусом не true?

4b9b3361

Ответ 1

" Exit, Exit! Abort, Raise... Get Me Outta Here!" описывает все, что вы хотите знать, я думаю.

Короче:

  • Kernel.exit(code) "немедленно выходит" из script и возвращает code в ОС, однако, перед тем, как это сделать, он вызывает любого зарегистрированного обработчика at_exit, который мог бы зарегистрировать ваш код.
  • Kernel.exit!(code) делает то же самое, но вызывается сразу же, обработчики at_exit не вызываются.
  • Kernel.abort(message) принимает message, который будет напечатан в STDERR непосредственно перед выходом с кодом ошибки = 1.

Различные значения кодов выхода едва подходят для обнаружения проблем и отладки кода. Тем не менее, они очень просты в использовании и делают процесс чтения родителями почти тривиальным. Следовательно, exit и exit!.

Если вы можете потратить больше времени и сделать проверку ошибок более надежной, вам понадобятся серьезные сообщения об ошибках, а не только коды. Традиционно вы можете печатать их в STDERR, если они существуют. Вы можете печатать вручную в STDERR с помощью обычного puts, но коды выхода будут по-прежнему использоваться на самом низком уровне.

Печать в STDERR не помещает ваше задание автоматически как сбой, поэтому была создана abort, чтобы вы могли легко писать и уходить. Код завершения по умолчанию для 1 достаточно, чтобы отметить условие FAIL, так как он предположил, что вся содержащаяся контекстная информация будет включена в сообщения об ошибках, предоставленные вами.

Также обратите внимание, что любые незаданные исключения, такие как raise "wtf" без rescue в любом месте, фактически ведут себя так, как будто вызывают Kernel.abort: они печатаются в STDERR и используют exitcode=1.

Вы сказали exit(false), но в документации exit! указано, что параметр status code будет использоваться.

Я только что проверил это на Windows и Ruby 1.9.3:

exit 0       # quits with code: 0
exit 1       # quits with code: 1
exit false   # quits with code: 1
exit true    # quits with code: 0

что меня действительно удивляет, так как я предполагаю, что false будет принудительно применено к 0 традиционным способом C. Таким образом, возможно, вам лучше использовать целые числа, такие как 0 или 1, чтобы понять, какой код будет использоваться.