为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
青春有我 2021-09-13 16:26:00
有人可以解释一下它们之间的主要区别os.Exit()以及panic()它们在 Go 中的实际使用方式吗?
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

首先,每当你有一个“如何在实践中使用”的问题时,一个好的开始方法是搜索Go 源代码(或任何足够大的 Go 代码库,真的),以及包文档以获得答案。

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

panic被调用时,包括隐式的运行时错误,例如索引切片越界或类型断言失败,它会立即停止当前函数的执行并开始展开 goroutine 的堆栈,并在此过程中运行任何延迟的函数。如果展开到达 goroutine 堆栈的顶部,程序就会终止。

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

大多数时候你不会使用panic(你应该返回一个error),并且你几乎不需要os.Exit在测试中的某些情况和快速程序终止之外。


查看完整回答
反对 回复 2021-09-13
?
郎朗坤

TA贡献1921条经验 获得超9个赞

首先,os.Exit()可以用来正常退出程序而不会出错,而不是panic,所以这是一个关键的区别。另一个是使用recover.

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

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

os.Exit(errorCode)如果你想使用或类似的东西:

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

  2. 想要在预期的错误(例如用户输入错误)上有序退出。

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


查看完整回答
反对 回复 2021-09-13
?
长风秋雁

TA贡献1757条经验 获得超7个赞

主要区别是:

  1. os.Exit 跳过延迟函数的执行。

  2. 使用os.Exit,您可以指定退出代码。

  3. panic正在终止而os.Exit不是。(似乎其他答案没有提到这一点。)

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

如果以这种方式定义非空函数:

  1. 该函数包含很多分支

  2. 所有分支都以return或终止panic

那么你不能用替换panicos.Exit否则编译器会拒绝编译程序,说“在函数结束时缺少返回”。(Go 在这里非常愚蠢,甚至log.Panic不终止函数。)

在其他条件下:

  1. 使用panic时的东西真的发生了连线,如编程逻辑错误。

  2. 使用os.Exit时,你要立即退出,与指定的退出代码。


查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信