Gestione degli errori
Garantire che Fiber catturi tutti gli errori che si verificano durante l'esecuzione dei gestori di percorsi e del middleware è cruciale. È necessario restituirli alla funzione gestore affinché Fiber li catturi e li elabori.
- Esempio
app.Get("/", func(c *fiber.Ctx) error {
// Passa l'errore a Fiber
return c.SendFile("file-non-esistente")
})
Per impostazione predefinita, Fiber non gestisce gli errori di panico. Per recuperare da eventuali panici causati dai gestori nello stack e evitare il blocco del programma Go, è necessario includere il middleware Recover
come mostrato di seguito:
- Esempio
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// Usa il middleware recover per catturare gli errori di panico
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("Questo panico è catturato da Fiber")
})
log.Fatal(app.Listen(":3000"))
}
Puoi utilizzare la struttura di errore personalizzata di Fiber con fiber.NewError()
per passare eventuali codici di stato
aggiuntivi. Il passaggio di un messaggio è facoltativo; se lasciato vuoto, verrà utilizzato il messaggio del codice di stato predefinito (ad esempio, 404
corrisponde a Non trovato
).
- Esempio
app.Get("/", func(c *fiber.Ctx) error {
// 503 Servizio non disponibile
return fiber.ErrServiceUnavailable
// 503 In vacanza!
return fiber.NewError(fiber.StatusServiceUnavailable, "In vacanza!")
})
Gestore degli errori predefinito
Fiber fornisce un gestore degli errori predefinito. Per gli errori standard, la risposta verrà inviata come 500 Internal Server Error. Se il tipo di errore è fiber.Error, la risposta verrà inviata utilizzando il codice di stato e il messaggio forniti.
- Esempio
// Gestore degli errori predefinito
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// Il codice di stato predefinito è 500
code := fiber.StatusInternalServerError
// Se è *fiber.Error, recupera il codice di stato personalizzato
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Imposta Content-Type: text/plain; charset=utf-8
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
// Restituisci il codice di stato e il messaggio di errore
return c.Status(code).SendString(err.Error())
}
Gestore degli errori personalizzato
È possibile impostare un gestore degli errori personalizzato durante l'inizializzazione dell'istanza di Fiber utilizzando Config.
Nella maggior parte dei casi, il gestore degli errori predefinito dovrebbe essere sufficiente. Tuttavia, se si desidera catturare diversi tipi di errori e intraprendere azioni corrispondenti, come inviare email di notifica o registrare gli errori in un sistema centralizzato, allora un gestore degli errori personalizzato sarà molto utile. È possibile inviare anche risposte personalizzate al client, come pagine di errore o solo una risposta JSON.
L'esempio seguente mostra come visualizzare pagine di errore per diversi tipi di errori.
- Esempio
// Crea una nuova istanza di Fiber con una configurazione personalizzata
app := fiber.New(fiber.Config{
// Sovrascrivi il gestore degli errori predefinito
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// Il codice di stato predefinito è 500
code := fiber.StatusInternalServerError
// Se è *fiber.Error, recupera il codice di stato personalizzato
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Invia una pagina di errore personalizzata
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
if err != nil {
// Se SendFile fallisce
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
}
// Ritorna dal gestore
return nil
},
})
// ...