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
    },
})

// ...