"Exit, Exit! Abort, Raise…Get Me Outta Here!"描述了你想知道的一切.
简而言之:
Kernel.exit(code)
立即"退出"脚本并将code
返回给操作系统,然而,就在执行之前,它会调用代码可能已注册的任何已注册at_exit
处理程序.Kernel.exit!(code)
也有同样的作用,但立即退出,没有at_exit
个处理程序被调用.Kernel.abort(message)
接受一个message
,在退出之前,它将打印到STDERR,故障代码=1.退出代码的不同值几乎不适合检测问题和调试代码.然而,它们的使用非常简单,让父进程读取它们几乎是微不足道的.因此,exit
和exit!
.
如果你能花更多的时间,使错误判断更加健壮,你将需要一些严重的错误信息,而不仅仅是代码.传统上,如果STDERR存在,您可以将它们打印到STDERR.您可以通过normal puts
手动打印到STDERR,但退出代码仍将在最低级别使用.
打印到STDERR不会自动将作业(job)标记为失败,因此创建abort
是为了让您轻松地写入和退出.默认退出代码1足以标记失败条件,因为它假定所有真实的上下文信息都将包含在您提供的错误消息中.
还要注意的是,任何未经处理的异常,例如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
会以传统的C方式强制变为0
.所以,也许你更应该使用像0
或1
这样的整数来清楚地知道将使用什么代码.