2016-03-14 11 views
12

golangでパニック対log.fatalln()を使用するのはいつですか? <a href="https://golang.org/pkg/log/#Fatalln" rel="noreferrer">log.Fatalln()</a>のドキュメントから

FUNC Fatalln(V ...インターフェイス{})os.Exitにコール続いFatallnがprintlnのと等価である() (1)。

Fatallnため

source code

310 // Fatalln is equivalent to Println() followed by a call to os.Exit(1). 
    311 func Fatalln(v ...interface{}) { 
    312  std.Output(2, fmt.Sprintln(v...)) 
    313  os.Exit(1) 
    314 } 

(あなたがパニックを回復することができるので)主な違いは、エラーが回復可能であるかどうか、今あるようだ - これらの間のより大きく異なるものはありますか?

パニックのインターフェイスdefinitionは次のとおりです。

215 // The panic built-in function stops normal execution of the current 
    216 // goroutine. When a function F calls panic, normal execution of F stops 
    217 // immediately. Any functions whose execution was deferred by F are run in 
    218 // the usual way, and then F returns to its caller. To the caller G, the 
    219 // invocation of F then behaves like a call to panic, terminating G's 
    220 // execution and running any deferred functions. This continues until all 
    221 // functions in the executing goroutine have stopped, in reverse order. At 
    222 // that point, the program is terminated and the error condition is reported, 
    223 // including the value of the argument to panic. This termination sequence 
    224 // is called panicking and can be controlled by the built-in function 
    225 // recover. 
    226 func panic(v interface{}) 

何も返さないパニックに表示されます。

これは主な違いですか?さもなければ、パニックが回復しないと仮定して、アプリケーションで同じ機能を実行するように見えます。

+1

パニック&リカバリがよく説明されている[official go blog](https://blog.golang.org/defer-panic-and-recover)を読むことを検討してください。 – pupizoid

答えて

9
  • ログメッセージは設定されたログ出力に移動しますが、パニックはstderrにのみ書き込みます。

  • パニックはスタックトレースを出力しますが、これはエラーにはまったく関係しません。

  • プログラムはパニックになりますが、os.Exitを呼び出すとすぐに終了し、遅延機能は実行できません。

一般的には、唯一のスタックトレースは、エラーのコンテキストに重要であるプログラミングエラーのためpanicを使用しています。メッセージがプログラマーをターゲットにしていない場合は、余分なデータにメッセージを隠すだけです。

+0

したがって、テストのコンテキストでは、それで? – enderland

+1

@enderland:スタックトレースが関連している場合にのみパニックになります(テスト時に無駄なスタックトレースが必要ないことがわかりますが、失敗に関する簡単なメッセージで十分です)。エラーメッセージを書くだけでよい場合は、そのメッセージを書いてください。 (また、 't.Fatal' /' t.Fatalf'と可能であればテストにログインする) – JimB

関連する問題