退出并带有错误代码?

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)


use*_*794 8

在 python 中,我通常使用转换为 go 的模式,如下所示:

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

    return 1
}

func main() {
    os.Exit(run())
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 5

我认为最明确的方法是将 设置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

请注意,这样做的一个重要缺点是您不会在设置错误代码后立即退出进程。

  • 这种方法的一个缺点是,如果您的代码发生恐慌,它永远不会被打印出来,因为在恐慌传播到顶部之前,您会延迟退出程序。 (2认同)