2013-09-23 47 views
22

什么是用一些错误代码退出程序的惯用方法?退出错误代码在去?

退出操作的文件说,“该计划将立即终止;延迟功能无法运行。”,并log.Fatal只是调用退出。对于那些不可怕的错误,终止程序而不运行延迟函数似乎极端。

我应该在某个时候通过身边的一些状态表明,一直错误,然后调用exit(1),在那里我知道,我可以放心地离开,与已运行的所有推迟的功能呢?

+1

什么具有的'默认clean'并设置为'dirty'非致命错误全局变量的状态。在你的'main()'退出之前,你可以检查这个变量。不是很好,但在某些情况下它可能是最简单的解决方案。 (我很高兴的评论不能donwvoted :)) – topskip

+1

是的,这基本上是我最终做的。我觉得不雅,因为我必须避免在主推迟任何东西(因为我仍然调用exit(1)设置返回代码,并没有想杀死我的递延FN),所以我坚持过去曾经是我的主要(只有三行,其中一个是延期)转化为函数。我希望有人会有更好的方式。到目前为止,有一人答道os.Exit,然后删除他们的答复,当我注释掉,我引用在我的岗位在os.Exit文档,并且现在有一个指向我os.Exit另一个答案。 – dan

回答

29

我一起在我最真实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 
} 
-1

确实是。 os包提供了这个。

package main 

import "os" 

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

http://golang.org/pkg/os/#Exit

编辑:所以看起来你知道退出的。这篇文章给出了一个Panic的概述,它会让返回的函数在返回之前运行。将此与退出一起使用可能是您要查找的内容。 http://blog.golang.org/defer-panic-and-recover

+2

我很确定@dan知道它。 – topskip

+0

也许我误读或编辑过,但我认为他在谈论别的事情。 – d1str0

3

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

但是,如果您需要延迟执行的功能应用,你总是可以使用defer keywork这样的:

http://play.golang.org/p/U-hAS88Ug4

你执行所有操作,影响一个错误变量,并在最后,当一切都清理完毕后,你可以安全地退出。

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

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

+0

我想我明白你在第一种方法中的含义,但这个例子有点让我困惑。为什么推迟fct1()和fct2()?这意味着它们将以相反的顺序执行!看起来你打算[更像这样的东西](http://play.golang.org/p/02aNIyQ7K-),或者不是? – marczoid

1

在Python中我通常使用模式,其转换后的去看起来像这样:

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

    return 1 
} 

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