dan*_*dan 40 error-handling exit go
使用一些错误代码退出程序的惯用方法是什么?
Exit
说"程序立即终止;延迟函数不运行.",log.Fatal
只是调用的文档Exit
.对于没有令人发指的错误的事情,在不运行延迟函数的情况下终止程序似乎是极端的.
我是否应该传递一些状态,表明存在错误,然后Exit(1)
在某些时候调用我知道我可以安全退出,所有延迟函数都已运行?
Gus*_*yer 60
我在大多数真正的main
软件包中都按照这些方式做了一些事情,以便return err
尽快采用约定,并且有适当的终止:
func main() {
if err := run(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}
func run() error {
err := something()
if err != nil {
return err
}
// etc
}
Run Code Online (Sandbox Code Playgroud)
在 python 中,我通常使用转换为 go 的模式,如下所示:
func run() int {
// here goes
// the code
return 1
}
func main() {
os.Exit(run())
}
Run Code Online (Sandbox Code Playgroud)
我认为最明确的方法是将 设置exitCode
在 的顶部main
,然后defer
关闭作为下一步。这使您可以更改 中的exitCode
任何位置main
,并且它的最后一个值将退出:
package main
import (
"fmt"
"os"
)
func main() {
exitCode := 0
defer func() { os.Exit(exitCode) }()
// Do whatever, including deferring more functions
defer func() {
fmt.Printf("Do some cleanup\n")
}()
func() {
fmt.Printf("Do some work\n")
}()
// But let's say something went wrong
exitCode = 1
// Do even more work/cleanup if you want
// At the end, os.Exit will be called with the last value of exitCode
}
Run Code Online (Sandbox Code Playgroud)
输出:
Do some work
Do some cleanup
Program exited: status 1.
Run Code Online (Sandbox Code Playgroud)
去游乐场https://play.golang.org/p/AMUR4m_A9Dw
请注意,这样做的一个重要缺点是您不会在设置错误代码后立即退出进程。
归档时间: |
|
查看次数: |
35392 次 |
最近记录: |