“exit”和“abort”的区别是什么?

43

abort 文档说明了 abort 函数会:

立即终止执行,实际上是通过调用 Kernel.exit(false) 来实现。

那么,“立即”意味着什么?abort 和使用非 true 状态的 exit 函数之间有什么区别吗?


1
一个有用的帖子是 - https://dev59.com/sG435IYBdhLWcg3wpxyx - Arup Rakshit
1个回答

66

"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。

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

如果您可以花更多时间,并使错误检查更加健壮,那么您将需要一些严格的错误消息,而不仅仅是代码。传统上,如果存在 STDERR,则可以将其打印到 STDERR。您可以通过正常的puts手动将其打印到 STDERR,但退出代码仍将在最低级别使用。

将内容打印到 STDERR 不会自动将工作标记为失败,因此,创建了abort以允许您轻松编写并退出。默认的退出代码为1足以标记 FAIL 状态,因为假定您提供的所有真实情境信息都将包含在错误消息中。

还要注意,在任何未处理的异常(例如没有任何rescueraise “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。所以,也许你应该使用整数例如01来明确代码将要使用什么。

@ArupRakshit:我实际上正在编辑和撰写它的过程中 :) - quetzalcoatl
所以我想,exit 是一种通用的终止程序的方式。如果你要在退出代码中提供一条消息,并且对退出代码 1 没有问题,那么可以使用 abortexit! 允许你跳过 at_exit 处理程序。不过我无法看到使用这个的情况。 - x-yuri
2
exit(false)是来自文档的引用,您可能正在使用其简化版本。此外,您链接的文章中提到:“在Unix世界中有一个约定,退出代码等于0表示程序成功运行,任何其他退出代码都表示某种失败。”Windows也是如此。 - x-yuri
而且在“中止”描述中,“立即”似乎并没有太多意义。我想退出立即的是exit! - x-yuri
exit(true)返回0的原因是Unix/Linux/Posix程序退出状态惯例与C布尔值惯例相反。在Posix中,“成功”退出状态为0。任何非零值都表示失败,该值可以选择性地用于通信/区分故障类型。如果exit(true)表示程序失败,而exit(false)表示程序成功,那将会很奇怪,尽管这更符合C布尔值惯例。 - BobDoolittle
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接