Tratamento de Erros
Garantir que o Fiber capture todos os erros que ocorrem durante a execução dos manipuladores de rotas e middlewares é crucial. Você deve retorná-los para a função do manipulador para que o Fiber os capture e os processe.
- Exemplo
app.Get("/", func(c *fiber.Ctx) error {
// Passar o erro para o Fiber
return c.SendFile("arquivo-nao-existe")
})
Por padrão, o Fiber não manipula erros de pânico. Para se recuperar de qualquer pânico lançado pelos manipuladores na pilha e evitar que o programa Go falhe, você precisa incluir o middleware Recover
como mostrado abaixo:
- Exemplo
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// Usar o middleware recover para capturar erros de pânico
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("Esse pânico é capturado pelo fiber")
})
log.Fatal(app.Listen(":3000"))
}
Você pode usar a estrutura de erro personalizada do Fiber com fiber.NewError()
para passar códigos de status adicionais. Passar uma mensagem é opcional; se deixado em branco, será usado como a mensagem de código de status padrão (por exemplo, 404
equivale a Não encontrado
).
- Exemplo
app.Get("/", func(c *fiber.Ctx) error {
// 503 Serviço Indisponível
return fiber.ErrServiceUnavailable
// 503 Em férias!
return fiber.NewError(fiber.StatusServiceUnavailable, "Em férias!")
})
Manipulador de Erro Padrão
O Fiber fornece um manipulador de erro padrão. Para erros padrão, a resposta será enviada como 500 Internal Server Error. Se o tipo de erro for fiber.Error, a resposta será enviada usando o código de status e a mensagem fornecidos.
- Exemplo
// Manipulador de erro padrão
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// O código de status padrão é 500
code := fiber.StatusInternalServerError
// Se for *fiber.Error, recuperar o código de status personalizado
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Definir Content-Type: text/plain; charset=utf-8
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
// Retornar o código de status e a mensagem de erro
return c.Status(code).SendString(err.Error())
}
Manipulador de Erro Personalizado
Você pode definir um manipulador de erro personalizado ao inicializar a instância do Fiber usando Config.
Na maioria dos casos, o manipulador de erro padrão deve ser suficiente. No entanto, se você deseja capturar diferentes tipos de erros e tomar ações correspondentes, como enviar e-mails de notificação ou registrar os erros em um sistema centralizado, então um manipulador de erro personalizado será muito útil. Você também pode enviar respostas personalizadas para o cliente, como páginas de erro ou apenas uma resposta JSON.
O exemplo a seguir mostra como exibir páginas de erro para diferentes tipos de erros.
- Exemplo
// Criar uma nova instância do Fiber com configuração personalizada
app := fiber.New(fiber.Config{
// Substituir o manipulador de erro padrão
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// O código de status padrão é 500
code := fiber.StatusInternalServerError
// Se for *fiber.Error, recuperar o código de status personalizado
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Enviar uma página de erro personalizada
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
if err != nil {
// Se SendFile falhar
return ctx.Status(fiber.StatusInternalServerError).SendString("Erro no Servidor Interno")
}
// Retornar do manipulador
return nil
},
})
// ...