2013-09-23 63 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()) 
}