abort
文档说明了 abort
函数会:
立即终止执行,实际上是通过调用 Kernel.exit(false) 来实现。
那么,“立即”意味着什么?abort
和使用非 true
状态的 exit
函数之间有什么区别吗?
"Exit, Exit! Abort, Raise…Get Me Outta Here!"对此进行了全面描述。
简而言之:
Kernel.exit(code)
立即“退出”脚本并将 code
返回给操作系统,但在执行此操作之前,它会调用您的代码可能已注册的任何已注册的 at_exit
处理程序。Kernel.exit!(code)
执行相同的操作,但立即退出,不调用任何 at_exit
处理程序。Kernel.abort(message)
获取一个 message
,该消息将在以失败 code=1 退出之前打印到 STDERR。使用不同的退出代码仅适用于检测问题和调试代码。但是,它们非常简单易用,并且使父进程读取它们几乎是微不足道的。因此,使用exit
和exit!
。
如果您可以花更多时间,并使错误检查更加健壮,那么您将需要一些严格的错误消息,而不仅仅是代码。传统上,如果存在 STDERR,则可以将其打印到 STDERR。您可以通过正常的puts
手动将其打印到 STDERR,但退出代码仍将在最低级别使用。
将内容打印到 STDERR 不会自动将工作标记为失败,因此,创建了abort
以允许您轻松编写并退出。默认的退出代码为1足以标记 FAIL 状态,因为假定您提供的所有真实情境信息都将包含在错误消息中。
还要注意,在任何未处理的异常(例如没有任何rescue
的 raise “wtf”
),实际上的行为就像调用Kernel.abort
:它们打印到 STDERR 并使用exitcode=1
。
你说exit(false)
,但是exit!
文档说参数是要使用的状态码
。
我刚刚在 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
这真的让我感到惊讶,因为我本以为在传统的C语言中false
会被强制转换为0
。所以,也许你应该使用整数例如0
或1
来明确代码将要使用什么。exit
是一种通用的终止程序的方式。如果你要在退出代码中提供一条消息,并且对退出代码 1
没有问题,那么可以使用 abort
。exit!
允许你跳过 at_exit
处理程序。不过我无法看到使用这个的情况。 - x-yuriexit(false)
是来自文档的引用,您可能正在使用其简化版本。此外,您链接的文章中提到:“在Unix世界中有一个约定,退出代码等于0表示程序成功运行,任何其他退出代码都表示某种失败。”Windows也是如此。 - x-yuriexit!
。 - x-yuri