Devo registrare gli errori nella funzione che si verificano? o passarli indietro e registrarli quando il controllo ritorna?

0

Una delle cose che amo di Go è il modo in cui incoraggiano gli errori di passaggio come valori di ritorno, ma quando si tratta di loggare qual è la soluzione più gestibile: passare l'errore il più indietro possibile nel mucchio di esecuzione e registrare tutto lì , o registrarlo nella funzione in cui si è verificato lì e poi?

Quindi il primo:

func main() {
    err := DoSomething()
    if err != nil {
        log.Printf(err)
    }
}

func DoSomething() error {
    return DoSomethingElse()
}

func DoSomethingElse() error {
    return ThisFunctionMayCauseAnErrorAndIsHorriblyNamed()
}

o

func main() {
    _ := DoSomething()
}

func DoSomething() error {
    return DoSomethingElse()
}

func DoSomethingElse() error {
    err := ThisFunctionMayCauseAnErrorAndIsHorriblyNamed()
    if err != nil {
        log.Printf(err)
    }
}
    
posta leylandski 02.02.2016 - 13:28
fonte

2 risposte

2

La preoccupazione principale che ho riscontrato con la registrazione vicino all'origine è che si corre il rischio di registrare gli stessi errori due volte. Nel secondo caso potremmo immaginare qualcuno che chiama DoSomethingElse() senza essere sicuro se registrare l'errore. Questi casi diventano sempre più comuni con l'aumentare delle dimensioni e della complessità del componente e il numero di volte in cui viene registrato un errore viene ridimensionato con le dimensioni.

Quando gli errori vengono registrati più volte in più punti, la densità delle informazioni utili nei registri diminuisce e quindi anche il valore di tali registri diminuisce.

Quando i programmatori seguono invece il primo esempio e registrano da un livello superiore, c'è molto meno pericolo che i registri vengano ripetuti. Inoltre, a livelli più alti i registri possono includere molto più significato del sistema. DoSomethingElse() potrebbe provare a inviare una stringa SQL a un database Postgres, mentre main sta tentando di eliminare tutti gli account utente scaduti.

I log da DoSomethingElse possono includere solo informazioni di livello molto basso - la query SQL che è stata inviata, la stringa di connessione tentata, ecc. - mentre main può fornire tutti questi (perché l'errore è stato trasmesso verso l'alto ) ma forniscono anche una descrizione di alto livello, ad es "Impossibile connettersi al database durante il tentativo di eliminare account obsoleti.".

Queste descrizioni di alto livello rendono i registri più preziosi fornendo utili glosse sugli errori riscontrati. Quindi, in generale, raccomanderei il logging dal più alto livello possibile.

    
risposta data 02.02.2016 - 14:32
fonte
2

Il principale inconveniente della seconda soluzione (passare gli errori in alto) è: quando esegui le funzioni mutiple nella riga che possono generare errori, non devi creare if per ognuna, ma puoi fare solo un if al livello più alto. E questa soluzione è anche incoraggiata su blog Go lang (sezione Simplifying repetitive error handling ).

    
risposta data 02.02.2016 - 14:16
fonte

Leggi altre domande sui tag