Ich habe bisher die Verwendung von log.Fatal
vermieden, aber ich habe vor kurzem zufällig diese Fragen entdeckt; code-coverage und tests-using-log-fatal.Sollte ein Go-Paket jemals log.Fatal verwenden und wann?
Einer der Kommentare aus den 100 Code-Coverage-Fragen sagt:
... In der überwiegenden Mehrzahl der Fälle
log.Fatal
sollte nur in Haupt- oder init-Funktionen verwendet werden (oder möglicherweise einige Dinge gemeint genannt werden, nur direkt von ihnen)“
Es gehen mir zu denken, so begann ich an der Standard-Bibliothek Code mit Go zur Verfügung gestellt zu sehen. Es gibt viele Beispiele, wo die Test Code in der Bibliothek der Nutzung macht log.Fatal
scheint gut zu sein
// 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)
}
}
...
}
Wenn seine beste Praxis zu vermeiden Verwendung von log.Fatal
ist, warum ist es überhaupt in den Standardbibliotheken verwendet, ich erwartet hätte: ein paar Beispiele außerhalb des Testcodes, wie in net/http
, unten gib einfach einen Fehler zurück. Es erscheint dem Benutzer der Bibliothek unfair, os.Exit
angerufen zu werden und keine Möglichkeit zu bieten, dass die Anwendung aufräumt.
Ich kann naiv sein, daher meine Frage als eine bessere Praxis scheint zu log.Panic
zu sein, die wiederhergestellt werden kann und meine theoretische lang laufende stabile Anwendung könnte eine Chance haben, aus der Asche zu steigen.
Also was wäre Best-Practice sagen für Go wann sollte log.Fatal verwendet werden?
Meine Hoffnung wäre, dass dieser Code absolut unerreichbar ist. Dass ein Fehler, der dazu führt, dass sich eine inaktive Verbindung immer noch in der inaktiven Liste befindet, während sie gleichzeitig als aktive Verbindung verwendet wird, sollte nicht etwas sein, was jemals passieren sollte, und das sollte katastrophal sein. Aber da sie scheinen, Mutexe richtig um die freie Liste und so weiter zu verwenden, habe ich keine Idee, warum diese Schleife und der Code überhaupt notwendig wären. Warum sie Ihr Programm lieber sofort beenden würden als Panik zu verbreiten, ist ein weiteres Rätsel. Große Frage. – captncraig
Kann einer der Tests in diesem Paket diese Linie erreichen? – captncraig
Gute Frage, hatte ein wenig Blick und kann nichts sehen, das aussieht wie sein speziell entwickelt, um diese Linie zu erreichen. Noch nicht schlüssig ... – miltonb