Manejo de Errores
Asegurarse de que Fiber capture todos los errores que ocurran al ejecutar los manejadores de rutas y middleware es crucial. Debes devolverlos a la función de manejador para que Fiber los capture y los procese.
- Ejemplo
app.Get("/", func(c *fiber.Ctx) error {
// Pasa el error a Fiber
return c.SendFile("file-does-not-exist")
})
Por defecto, Fiber no maneja errores de pánico. Para recuperarse de cualquier pánico lanzado por los manejadores en la pila y evitar que el programa Go se bloquee, es necesario incluir el middleware Recover
como se muestra a continuación:
- Ejemplo
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// Usa el middleware recover para capturar errores de pánico
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("Este pánico es capturado por fiber")
})
log.Fatal(app.Listen(":3000"))
}
Puedes usar la estructura de error personalizada de Fiber con fiber.NewError()
para pasar códigos de estado adicionales. Pasar un mensaje es opcional; si se deja vacío, se usará el mensaje del código de estado por defecto (por ejemplo, 404
equivale a No Encontrado
).
- Ejemplo
app.Get("/", func(c *fiber.Ctx) error {
// 503 Servicio No Disponible
return fiber.ErrServiceUnavailable
// 503 ¡De vacaciones!
return fiber.NewError(fiber.StatusServiceUnavailable, "¡De vacaciones!")
})
Manejador de Errores Predeterminado
Fiber proporciona un manejador de errores predeterminado. Para errores estándar, la respuesta se enviará como 500 Error Interno del Servidor. Si el tipo de error es fiber.Error, la respuesta se enviará utilizando el código de estado y mensaje proporcionados.
- Ejemplo
// Manejador de errores predeterminado
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// El código de estado por defecto es 500
code := fiber.StatusInternalServerError
// Si es *fiber.Error, obtener el código de estado personalizado
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Establecer Content-Type: text/plain; charset=utf-8
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
// Devolver el código de estado y el mensaje de error
return c.Status(code).SendString(err.Error())
}
Manejador de Errores Personalizado
Puedes establecer un manejador de errores personalizado al inicializar la instancia de Fiber usando Config.
En la mayoría de los casos, el manejador de errores predeterminado debería ser suficiente. Sin embargo, si deseas capturar diferentes tipos de errores y tomar acciones correspondientes, como enviar correos electrónicos de notificación o registrar los errores en un sistema centralizado, entonces un manejador de errores personalizado será muy útil. También puedes enviar respuestas personalizadas al cliente, como páginas de error o simplemente una respuesta JSON.
El siguiente ejemplo muestra cómo mostrar páginas de error para diferentes tipos de errores.
- Ejemplo
// Crear una nueva instancia de Fiber con configuración personalizada
app := fiber.New(fiber.Config{
// Sobrescribir el manejador de errores predeterminado
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// El código de estado por defecto es 500
code := fiber.StatusInternalServerError
// Si es *fiber.Error, obtener el código de estado personalizado
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Enviar una página de error personalizada
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
if err != nil {
// Si SendFile falla
return ctx.Status(fiber.StatusInternalServerError).SendString("Error Interno del Servidor")
}
// Devolver desde el manejador
return nil
},
})
// ...