是否在go中退出并返回错误代码?

qcuzuvrc  于 2022-12-07  发布在  Go
关注(0)|答案(5)|浏览(281)

退出程序并返回错误代码的惯用方法是什么?
Exit的文档说明“程序立即终止;延迟的函数不运行。",而log.Fatal只调用Exit。对于不严重的错误,在不运行延迟的函数的情况下终止程序似乎是极端的。
我是否应该传递一些状态来指示出现了错误,然后在某个我知道可以安全退出的点调用Exit(1),并且所有延迟的函数都已经运行?

vjrehmav

vjrehmav1#

我在大多数真实的的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
}
i7uaboj4

i7uaboj42#

在Python中,我通常使用一个模式,它被转换成Go语言时看起来像这样:

func run() int {
    // here goes
    // the code

    return 1
}

func main() {
    os.Exit(run())
}
guykilcj

guykilcj3#

我认为最简单的方法是在main的顶部设置exitCode,然后在下一步关闭defer。这样你就可以在main中的任何地方修改exitCode,并且它的最后一个值将以如下方式退出:

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
}

输出量:

Do some work
Do some cleanup

Program exited: status 1.

前往Playgroundhttps://play.golang.org/p/AMUR4m_A9Dw
请注意,这样做的一个重要缺点是,您不会在设置错误代码后立即退出进程。

bjp0bcyl

bjp0bcyl4#

正如fas所提到的,您有来自os包的func Exit(exitcode int)
但是,如果需要应用defered函数,则始终可以使用defer关键字,如下所示:
http://play.golang.org/p/U-hAS88Ug4
你执行所有的操作,影响一个错误变量,在最后,当一切都被清理干净,你可以安全地退出。
否则,您也可以使用panic/recover:http://play.golang.org/p/903e76GnQ-
当你遇到错误时,你会恐慌,在你捕捉(恢复)它的地方结束你的清理。

6ojccjat

6ojccjat5#

是的,实际上,操作系统包提供了这个。

package main

import "os"

func main() {
    os.Exit(1)
}

http://golang.org/pkg/os/#Exit
编辑:看起来你知道Exit。这篇文章给出了Panic的概述,它会让延迟函数在返回前运行。将它与exit结合使用可能是你想要的。http://blog.golang.org/defer-panic-and-recover

相关问题