退出和中止有什么区别?

时间:2014-04-28 12:01:18

标签: ruby exit

abort文档说abort

  

通过调用Kernel.exit(false)来立即终止执行。

究竟是什么"立即"意思? abortexit与非true状态有何区别?

1 个答案:

答案 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。

退出代码的不同值几乎不适合检测问题和调试代码。但是,它们使用起来非常简单,并且使父进程读取它们几乎是微不足道的。因此,exitexit!

如果您可以花费更多时间并使错误检查更加健壮,那么您需要一些严重的错误消息,而不仅仅是代码。传统上,如果存在,您可以将它们打印到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。所以,也许您应该使用01之类的整数来清楚地知道将使用哪些代码。