私は今までlog.Fatal
の使用を避けましたが、最近私はこれらの質問を共同で発見しました。 code-coverageおよびtests-using-log-fatal。Goパッケージでlog.Fatalを使用する必要がありますか?
100コード・カバレッジ・質問のコメントの一つは言う:例log.Fatal
の大半で
は...メイン、またはinit関数(または多分に意図いくつかのものだけを使用するべきです
それは私が考えて行く「)、そこからのみ直接呼び出すことが、私は行くが提供する標準ライブラリのコードを見て始めました。多くの例では、ライブラリ内のテストコードはを使用するところがありますlog.Fatal
これは問題ありません。以下のようなnet/http
のようにテストコード、外のいくつかの例:
// net/http/transport.go
func (t *Transport) putIdleConn(pconn *persistConn) bool {
...
for _, exist := range t.idleConn[key] {
if exist == pconn {
log.Fatalf("dup idle pconn %p in freelist", pconn)
}
}
...
}
をそのがlog.Fatal
の使用を回避するためのベストプラクティスである場合には、なぜそれが標準ライブラリには全く使用されている、私は期待しているだろうただエラーを返します。 os.Exit
が呼び出され、アプリケーションがクリーンアップする機会を与えないようにするには、ライブラリのユーザーにとって不公平に思えます。
私は純粋ではないかもしれないので、より良い練習としての私の質問は、回復することができるlog.Panic
と呼ぶように思えます。理論的に長時間安定したアプリケーションが灰から浮かび上がる可能性があります。
だから、ログの告知はいつ行うべきですか?
私の希望は、このコードは絶対に到達できないことです。アイドル状態の接続をアクティブな接続として使用している間にアイドル状態の接続を引き続き引き起こすエラーは、これまでに起こるべきものであってはならず、発生するためには何か壊滅的なものでなければならない。しかし、アイドルリストの周りにmutexを適切に使用しているように見えるので、なぜこのループとコードが必要なのかはわかりません。彼らがなぜあなたのプログラムをすぐに終了するのではなく、別の謎です。素晴らしい質問。 – captncraig
そのパッケージ内のテストはその行に到達できますか? – captncraig
良い質問ですが、少し見て、その行に到達するように特別に設計されたようなものは見えません。まだ確定していません... – miltonb