什么时候在Golang中使用os.Exit()和panic()?
有人可以解释os.Exit()
和panic()
之间的关键差异,以及它们在Golang中如何用于实践?
首先,每当你有一个“如何在实践中使用”的问题,一个好的开始就是search Go源代码(或者任何足够大的Go代码库),以及包文档的答案。
现在, os.Exit
和panic
是完全不同的。 当程序或其部分达到不可恢复的状态时使用panic
。
当调用
panic
,包括隐式地运行时错误,例如索引切片越界或失败types断言,它立即停止当前函数的执行,并开始展开goroutine的堆栈,沿途运行任何延迟的函数。 如果展开到达goroutine堆栈的顶部,程序就会死亡。
os.Exit
用于需要立即中止程序,不可能恢复或运行延迟清理语句,并返回错误代码(其他程序可用于报告发生的事情)。 这在testing中很有用,当你已经知道在这个testing失败之后,另一个也会失败,所以你不妨现在退出。 当你的程序完成了所有需要做的事情时,这也可以使用,现在只需要退出,即在打印帮助信息之后。
大多数情况下,你不会使用panic
(你应该返回一个error
),而且在testing和快速程序终止之外,几乎不需要os.Exit
。
首先, os.Exit()
可以用来正常退出程序而不会出现错误,而且恐慌不会,所以这是一个关键的区别。 另一个是可以捕捉并忽略或logging使用recover
恐慌。
但是,如果我们谈论的是一个错误的退出码,让我们说:
当出现可怕的错误时使用panic
,可能是程序员在生产之前应该被捕获的错误。 这就是它打印堆栈的原因。
使用os.Exit(errorCode)
或类似的东西,如果你想:
-
控制程序的退出代码以用于脚本目的。
-
想要一个预期的错误(例如,用户input错误)有序退出。
所以基本恐慌是给你的,一个糟糕的退出代码是为你的用户。