首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候使用os.Exit()和panic()?

什么时候使用os.Exit()和panic()?
EN

Stack Overflow用户
提问于 2015-02-12 16:45:35
回答 3查看 67.5K关注 0票数 117

谁能解释一下os.Exit()panic()之间的主要区别,以及它们是如何在Go中实际使用的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-12 17:08:02

首先,每当你有一个“它是如何在实践中使用”的问题时,一个好的开始方法是search Go源代码(或者任何足够大的Go代码库,真的),以及答案的package docs

现在,os.Exitpanic是完全不同的。当程序或其部分达到不可恢复状态时,将使用panic

panic被调用时,它会立即停止当前函数的执行,并开始展开goroutine的堆栈,在此过程中运行任何延迟函数。如果展开到达goroutine堆栈的顶部,程序就会终止。

当您需要立即中止程序,并且不可能恢复或运行延迟的清理语句,并且还返回错误代码(其他程序可以用来报告所发生的事情)时,可以使用os.Exit。这在测试中很有用,因为您已经知道在这一个测试失败之后,另一个测试也会失败,所以您最好现在就退出。当你的程序已经完成了它需要做的所有事情,现在只需要退出,也就是在打印帮助消息之后,也可以使用它。

大多数情况下,您不会使用panic (应该返回一个error ),而且在测试和快速终止程序的某些情况下,您几乎不需要os.Exit

票数 102
EN

Stack Overflow用户

发布于 2015-02-12 17:05:05

首先,os.Exit()可以用于正常退出程序而不会出现错误,而不会导致死机,所以这是一个关键的区别。另一种是使用recover可以捕获并忽略或记录某个地方的异常。

但是如果我们讨论的是一个错误的退出代码,我们就说:

当出现严重错误时使用panic,这可能是程序员的错误,在投入生产之前就应该被捕获。这就是它打印堆栈的原因。

如果需要,可以使用os.Exit(errorCode)或类似的工具:

  1. 出于脚本目的控制程序的退出代码。
  2. 希望在出现预期错误(例如用户输入错误)时按顺序退出。

所以基本上,恐慌是给你的,一个坏的退出代码是给你的用户的。

票数 95
EN

Stack Overflow用户

发布于 2019-03-13 01:45:49

主要区别在于:

  1. os.Exit跳过延迟函数的执行。使用os.Exit,您可以指定exit
  2. 正在终止,而os.Exit不终止。(似乎其他答案没有提到这一点。)

如果需要执行延迟函数,除了panic别无选择。(另一方面,如果您想跳过延迟函数的执行,请使用os.Exit。)

如果一个非void函数是这样定义的:

  1. 该函数包含许多分支
  2. 所有分支都以returnpanic

终止

那么你就不能用os.Exit替换panic,否则编译器会拒绝编译程序,说“函数末尾缺少返回值”。(Go在这里非常愚蠢,即使是log.Panic也不会终止函数。)

在其他情况下:

  1. 在实际发生某些事情时使用panic,例如编程逻辑错误。
  2. 在您需要立即退出时使用os.Exit,并指定退出代码。
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28472922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档