谁能解释一下os.Exit()
和panic()
之间的主要区别,以及它们是如何在Go中实际使用的?
发布于 2015-02-12 17:08:02
首先,每当你有一个“它是如何在实践中使用”的问题时,一个好的开始方法是search Go源代码(或者任何足够大的Go代码库,真的),以及答案的package docs。
现在,os.Exit
和panic
是完全不同的。当程序或其部分达到不可恢复状态时,将使用panic
。
当
panic
被调用时,它会立即停止当前函数的执行,并开始展开goroutine的堆栈,在此过程中运行任何延迟函数。如果展开到达goroutine堆栈的顶部,程序就会终止。
当您需要立即中止程序,并且不可能恢复或运行延迟的清理语句,并且还返回错误代码(其他程序可以用来报告所发生的事情)时,可以使用os.Exit
。这在测试中很有用,因为您已经知道在这一个测试失败之后,另一个测试也会失败,所以您最好现在就退出。当你的程序已经完成了它需要做的所有事情,现在只需要退出,也就是在打印帮助消息之后,也可以使用它。
大多数情况下,您不会使用panic
(应该返回一个error
),而且在测试和快速终止程序的某些情况下,您几乎不需要os.Exit
。
发布于 2015-02-12 17:05:05
首先,os.Exit()
可以用于正常退出程序而不会出现错误,而不会导致死机,所以这是一个关键的区别。另一种是使用recover
可以捕获并忽略或记录某个地方的异常。
但是如果我们讨论的是一个错误的退出代码,我们就说:
当出现严重错误时使用panic
,这可能是程序员的错误,在投入生产之前就应该被捕获。这就是它打印堆栈的原因。
如果需要,可以使用os.Exit(errorCode)
或类似的工具:
所以基本上,恐慌是给你的,一个坏的退出代码是给你的用户的。
发布于 2019-03-13 01:45:49
主要区别在于:
os.Exit
跳过延迟函数的执行。使用os.Exit
,您可以指定exit os.Exit
不终止。(似乎其他答案没有提到这一点。)如果需要执行延迟函数,除了panic
别无选择。(另一方面,如果您想跳过延迟函数的执行,请使用os.Exit
。)
如果一个非void函数是这样定义的:
return
或panic
终止
那么你就不能用os.Exit
替换panic
,否则编译器会拒绝编译程序,说“函数末尾缺少返回值”。(Go在这里非常愚蠢,即使是log.Panic
也不会终止函数。)
在其他情况下:
panic
,例如编程逻辑错误。os.Exit
,并指定退出代码。https://stackoverflow.com/questions/28472922
复制相似问题