Ho finora evitato l'uso di log.Fatal
, ma recentemente ho scoperto casualmente queste domande; code-coverage e tests-using-log-fatal.Nel caso in cui un pacchetto Go utilizzi log.Fatal e quando?
Uno dei commenti delle domande di copertura 100 del codice dice:
... Nella stragrande maggioranza dei casi
log.Fatal
dovrebbe essere essere utilizzato solo nelle funzioni principali, o init (o, eventualmente, alcune cose destinata a essere chiamato solo direttamente da loro)"
andare fatto pensare, così ho cominciato a guardare il codice della libreria standard fornito con Go. ci sono un sacco di esempi in cui il codice prova nella biblioteca fa uso di log.Fatal
che sembra soddisfacente alcuni esempi al di fuori del codice di test, come ad esempio in net/http
, di seguito riportate:
// 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)
}
}
...
}
Se la sua è delle migliori pratiche per evitare l'uso di log.Fatal
, perché è utilizzato a tutti nelle librerie standard, mi sarei aspettato basta restituire un errore. Sembra ingiusto che l'utente della libreria faccia chiamare os.Exit
e non fornisca alcuna possibilità per l'applicazione di ripulire.
posso essere ingenuo, così da qui la mia domanda come una pratica migliore sembrerebbe quella di chiamare log.Panic
che può essere recuperata e la mia teorica lungo in esecuzione un'applicazione stabile potrebbe avere la possibilità di salire dalle ceneri.
Quindi cosa sarebbe meglio dire per Go in merito a quando dovrebbe log.Fatal dovrebbe essere utilizzato?
La mia speranza sarebbe che questo codice sia assolutamente irraggiungibile. Che un errore che fa sì che una connessione inattiva rimanga nell'elenco di inattività mentre viene utilizzato anche come connessione attiva non dovrebbe essere qualcosa che dovrebbe accadere sempre e che ciò avvenga dovrebbe essere qualcosa di catastrofico. Ma dal momento che sembrano utilizzare correttamente i mutex attorno alla lista inattiva e così via, non ho idea del perché questo ciclo e il codice sarebbero addirittura necessari. Perché dovrebbero uscire ulteriormente dal tuo programma immediatamente, piuttosto che fare un po 'di panico è un altro mistero. Grande domanda. – captncraig
Alcuni test di quel pacchetto sono in grado di raggiungere quella linea? – captncraig
Una buona domanda, ha avuto un aspetto piccolo e non vedo nulla che assomigli al suo specifico design per raggiungere quella linea. Non ancora conclusivo ... – miltonb