何时使用os.Exit()和panic()?

时间:2015-02-12 08:45:35

标签: go exit

有人可以解释os.Exit()panic()之间的主要区别以及它们在Go中的使用方式吗?

2 个答案:

答案 0 :(得分:70)

首先,os.Exit()可用于正常退出程序而不会出现错误,并且不会发生恐慌,因此这是一个关键的区别。另一个问题是使用recover可以捕获并忽略或记录恐慌。

但如果我们在谈论错误的退出代码,请说:

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

如果您愿意,请使用os.Exit(errorCode)或类似内容:

  1. 为脚本目的控制程序的退出代码。

  2. 希望有序退出预期的错误(例如用户输入错误)。

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

答案 1 :(得分:65)

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

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

  

当调用panic时,隐式包含运行时错误,例如将切片索引越界或类型断言失败,它会立即停止执行当前函数并开始展开goroutine的堆栈,沿途运行任何延迟函数。如果那个展开到达goroutine堆栈的顶部,程序就会死掉。

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

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