В документации abort
указано abort
будет
Завершить выполнение немедленно, эффективно, вызвав Kernel.exit(false).
Что именно означает "сразу"? В чем разница между abort
и exit
с статусом не true
?
В документации abort
указано abort
будет
Завершить выполнение немедленно, эффективно, вызвав Kernel.exit(false).
Что именно означает "сразу"? В чем разница между abort
и exit
с статусом не true
?
" 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
, чтобы понять, какой код будет использоваться.