退出在旅途中的错误代码?

问题描述 投票:36回答:5

什么是退出了一些错误代码的程序的惯用方式是什么?

对于Exit文档说“该计划将立即终止;延迟功能无法运行。”,并log.Fatal只是调用Exit。对于事情是不是十恶不赦的错误,终止程序不运行延迟功能似乎极端。

我应该通过周围的一些状态表明,有许多人的错误,然后在某个时刻调用Exit(1),我知道,我可以放心地退出,所有的延迟功能已经运行?

error-handling go exit
5个回答
54
投票

我沿着大部分我真正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
}

3
投票

正如FAS提到的,你已经从操作系统封装func Exit(exitcode int)

但是,如果你需要延期的功能应用,你总是可以这样使用qazxsw POI关键字:

defer

您可以执行所有的操作,影响一个错误变量,并在最后,当一切都被清理了,你可以放心地离开。

否则,你也可以使用恐慌/恢复:http://play.golang.org/p/U-hAS88Ug4

当你有一个错误,你慌了,结束了,你在那里清理你赶上(恢复)它。


2
投票

在蟒蛇我通常使用其转化为去看起来像这样的模式:

http://play.golang.org/p/903e76GnQ-

0
投票

我认为最清晰的方式来做到这一点是设置在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.

需要注意的是这方面的一个重要的缺点是,你不只要你设置错误代码退出的过程。


-1
投票

是的,其实。操作系统软件包提供了这一点。

https://play.golang.org/p/AMUR4m_A9Dw

package main import "os" func main() { os.Exit(1) }

编辑:所以看起来你知道退出的。本文给出了恐慌,这将让返回前运行延迟功能的概述。与出口相结合使用,这可能是你在找什么。 http://golang.org/pkg/os/#Exit

© www.soinside.com 2019 - 2024. All rights reserved.