答案 0 :(得分:42)
" Exit, Exit! Abort, Raise…Get Me Outta Here!"描述了我想要知道的一切。
简而言之:
Kernel.exit(code)
"退出"该脚本立即将code
返回给操作系统,但是,在执行操作之前,它会调用您的代码可以注册的任何已注册的at_exit
处理程序。Kernel.exit!(code)
执行相同的操作,但会立即退出,不会调用at_exit
个处理程序。Kernel.abort(message)
会在退出失败代码= 1之前将message
打印到STDERR。退出代码的不同值几乎不适合检测问题和调试代码。但是,它们使用起来非常简单,并且使父进程读取它们几乎是微不足道的。因此,exit
和exit!
。
如果您可以花费更多时间并使错误检查更加健壮,那么您需要一些严重的错误消息,而不仅仅是代码。传统上,如果存在,您可以将它们打印到STDERR。您可以通过普通puts
手动打印到STDERR,但退出代码仍将在最低级别使用。
打印到STDERR并不会将作业自动标记为失败,因此创建了abort
以便您轻松编写和退出。默认退出代码1足以标记失败条件,因为它假定所有真实的上下文信息都将包含在您提供的错误消息中。
另请注意,任何无法处理的例外情况,例如raise "wtf"
在任何地方都没有rescue
,实际上就像调用Kernel.abort
一样:它们打印到STDERR并使用exitcode=1
。< / p>
您说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
会以传统的C方式强制转移到0
。所以,也许您应该使用0
或1
之类的整数来清楚地知道将使用哪些代码。