什么时候使用 os.Exit() 和 panic()?
When to use os.Exit() and panic()?
有人可以解释一下 os.Exit()
和 panic()
之间的主要区别以及它们在 Go 中的实际应用吗?
首先,os.Exit()
可以用来正常退出程序,不会报错,也不会panic,所以这是一个关键的区别。另一个是可以使用 recover
.
捕获和忽略或记录某处的恐慌。
但是如果我们谈论的是错误的退出代码,比方说:
当出现严重错误时使用 panic
,这可能是程序员应该在投入生产之前发现的错误。这就是它打印堆栈的原因。
如果你想使用 os.Exit(errorCode)
或类似的东西:
控制程序的退出代码以用于脚本目的。
希望在出现预期错误时有序退出(例如用户输入错误)。
所以基本上恐慌是给你的,错误的退出代码是给你的用户的。
首先,当您遇到 "how it is used in practice" 问题时,一个好的开始方式是 search the Go source code (or any big enough Go code base, really), and the package docs 寻求答案。
现在,os.Exit
和 panic
完全不同了。 panic
当程序或其部分达到不可恢复状态时使用。
When panic
is called, including implicitly for run-time errors such as indexing a slice out of bounds or failing a type assertion, it immediately stops execution of the current function and begins unwinding the stack of the goroutine, running any deferred functions along the way. If that unwinding reaches the top of the goroutine's stack, the program dies.
os.Exit
用于 立即终止程序, 不可能恢复或运行 延迟清理语句,以及还有 return 一个错误代码(其他程序可以用它来报告发生了什么)。这在测试中很有用,当你已经知道在这个测试失败后,另一个测试也会失败,所以你最好现在就退出。这也可以在你的程序已经完成了它需要做的一切,现在只需要退出时使用,即在打印帮助消息之后。
大多数时候您不会使用 panic
(您应该使用 return 和 error
),并且在某些情况下您几乎不需要 os.Exit
在测试中和快速终止程序。
主要区别是:
os.Exit
跳过延迟函数的执行。
- 使用
os.Exit
,您可以指定退出代码。
panic
正在终止,而 os.Exit
不是。 (其他答案好像没有提到这个。)
如果你需要执行延迟函数,你别无选择panic
。 (另一方面,如果你想跳过延迟函数的执行,使用os.Exit
。)
如果一个非void函数是这样定义的:
- 函数包含很多分支
- 所有分支都以
return
或panic
结束
那你不能把panic
换成os.Exit
否则编译器会拒绝编译程序,说"missing return at end of function"。 (Go 在这里很笨,即使 log.Panic
也不会终止一个函数。)
其他条件下:
- 当真正有线的事情发生时使用
panic
,例如编程逻辑错误。
- 当您想要立即退出并指定退出代码时,请使用
os.Exit
。
有人可以解释一下 os.Exit()
和 panic()
之间的主要区别以及它们在 Go 中的实际应用吗?
首先,os.Exit()
可以用来正常退出程序,不会报错,也不会panic,所以这是一个关键的区别。另一个是可以使用 recover
.
但是如果我们谈论的是错误的退出代码,比方说:
当出现严重错误时使用 panic
,这可能是程序员应该在投入生产之前发现的错误。这就是它打印堆栈的原因。
如果你想使用 os.Exit(errorCode)
或类似的东西:
控制程序的退出代码以用于脚本目的。
希望在出现预期错误时有序退出(例如用户输入错误)。
所以基本上恐慌是给你的,错误的退出代码是给你的用户的。
首先,当您遇到 "how it is used in practice" 问题时,一个好的开始方式是 search the Go source code (or any big enough Go code base, really), and the package docs 寻求答案。
现在,os.Exit
和 panic
完全不同了。 panic
当程序或其部分达到不可恢复状态时使用。
When
panic
is called, including implicitly for run-time errors such as indexing a slice out of bounds or failing a type assertion, it immediately stops execution of the current function and begins unwinding the stack of the goroutine, running any deferred functions along the way. If that unwinding reaches the top of the goroutine's stack, the program dies.
os.Exit
用于 立即终止程序, 不可能恢复或运行 延迟清理语句,以及还有 return 一个错误代码(其他程序可以用它来报告发生了什么)。这在测试中很有用,当你已经知道在这个测试失败后,另一个测试也会失败,所以你最好现在就退出。这也可以在你的程序已经完成了它需要做的一切,现在只需要退出时使用,即在打印帮助消息之后。
大多数时候您不会使用 panic
(您应该使用 return 和 error
),并且在某些情况下您几乎不需要 os.Exit
在测试中和快速终止程序。
主要区别是:
os.Exit
跳过延迟函数的执行。- 使用
os.Exit
,您可以指定退出代码。 panic
正在终止,而os.Exit
不是。 (其他答案好像没有提到这个。)
如果你需要执行延迟函数,你别无选择panic
。 (另一方面,如果你想跳过延迟函数的执行,使用os.Exit
。)
如果一个非void函数是这样定义的:
- 函数包含很多分支
- 所有分支都以
return
或panic
结束
那你不能把panic
换成os.Exit
否则编译器会拒绝编译程序,说"missing return at end of function"。 (Go 在这里很笨,即使 log.Panic
也不会终止一个函数。)
其他条件下:
- 当真正有线的事情发生时使用
panic
,例如编程逻辑错误。 - 当您想要立即退出并指定退出代码时,请使用
os.Exit
。