Sobes.tech
Senior

Il servizio in produzione non è stabile più di 5 minuti. È stato possibile individuare il problema: c'è una funzione P() in una libreria di terze parti che, con una certa probabilità, provoca un panic. Come risolvere questo problema? La libreria è open source, il codice può essere visualizzato in vendor.

sobes.tech AI

Risposta dell'AI

Se la funzione P() di una libreria esterna provoca un panico con una certa probabilità, e il codice della libreria è aperto, si possono adottare i seguenti passaggi:

  1. Avvolgere la chiamata a P() in una struttura recover per intercettare il panico e prevenire il crash dell'intero servizio.

  2. Esaminare il codice della funzione P() nel vendor per capire le cause del panico — forse un errore logico o un uso scorretto.

  3. Se possibile, correggere l'errore nella libreria e ricompilarla.

  4. Se la correzione non è possibile o richiede tempo, si può scrivere un wrapper attorno a P() che chiami la funzione in modo sicuro e gestisca gli errori.

Esempio di wrapper con recover in Go:

func safeP() (err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("pánico catturato: %v", r)
        }
    }()
    P() // chiamata alla funzione problematica
    return nil
}

In questo modo, il servizio non fallirà a causa di un panico, e sarà possibile registrare e analizzare gli errori.