什么是退出了一些错误代码的程序的惯用方式是什么?
对于Exit
文档说“该计划将立即终止;延迟功能无法运行。”,并log.Fatal
只是调用Exit
。对于事情是不是十恶不赦的错误,终止程序不运行延迟功能似乎极端。
我应该通过周围的一些状态表明,有许多人的错误,然后在某个时刻调用Exit(1)
,我知道,我可以放心地退出,所有的延迟功能已经运行?
我沿着大部分我真正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
}
正如FAS提到的,你已经从操作系统封装func Exit(exitcode int)
。
但是,如果你需要延期的功能应用,你总是可以这样使用qazxsw POI关键字:
defer
您可以执行所有的操作,影响一个错误变量,并在最后,当一切都被清理了,你可以放心地离开。
否则,你也可以使用恐慌/恢复:http://play.golang.org/p/U-hAS88Ug4
当你有一个错误,你慌了,结束了,你在那里清理你赶上(恢复)它。
在蟒蛇我通常使用其转化为去看起来像这样的模式:
http://play.golang.org/p/903e76GnQ-
我认为最清晰的方式来做到这一点是设置在func run() int {
// here goes
// the code
return 1
}
func main() {
os.Exit(run())
}
的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
}
转到PlaygroundDo some work
Do some cleanup
Program exited: status 1.
需要注意的是这方面的一个重要的缺点是,你不只要你设置错误代码退出的过程。
是的,其实。操作系统软件包提供了这一点。
https://play.golang.org/p/AMUR4m_A9Dw
package main
import "os"
func main() {
os.Exit(1)
}
编辑:所以看起来你知道退出的。本文给出了恐慌,这将让返回前运行延迟功能的概述。与出口相结合使用,这可能是你在找什么。 http://golang.org/pkg/os/#Exit