Skip to main content
Recover middleware for Fiber recovers from panics anywhere in the request chain and handles them gracefully. When a panic occurs, it catches the error, optionally logs the stack trace, and returns a customizable error response.

Signatures

func New(config ...Config) fiber.Handler

Usage

import (
    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/fiber/v3/middleware/recover"
)

Basic Usage

// Default config
app.Use(recover.New())

// Custom configuration
app.Use(recover.New(recover.Config{
    EnableStackTrace: true,
}))

Custom Panic Handler

app.Use(recover.New(recover.Config{
    PanicHandler: func(c fiber.Ctx, r any) error {
        // Log the panic
        log.Printf("Panic occurred: %v", r)
        // Return custom error
        return c.Status(500).SendString("Internal Server Error")
    },
}))

Enable Stack Trace Logging

app.Use(recover.New(recover.Config{
    EnableStackTrace: true,
    StackTraceHandler: func(c fiber.Ctx, e any) {
        log.Printf("Stack trace for panic: %v\n%s", e, debug.Stack())
    },
}))

Configuration

Next
func(fiber.Ctx) bool
default:"nil"
Defines a function to skip this middleware when it returns true.
PanicHandler
func(fiber.Ctx, any) error
default:"DefaultPanicHandler"
Defines a function to customize the error produced from a recovered panic. The default handler returns a 500 Internal Server Error.
StackTraceHandler
func(fiber.Ctx, any)
default:"defaultStackTraceHandler"
Defines a function to handle stack trace logging when a panic occurs.
EnableStackTrace
bool
default:"false"
Enables stack trace handling when a panic is recovered.

Default Config

var ConfigDefault = Config{
    Next:              nil,
    EnableStackTrace:  false,
    StackTraceHandler: defaultStackTraceHandler,
    PanicHandler:      DefaultPanicHandler,
}

Common Use Cases

Production Error Handling

app.Use(recover.New(recover.Config{
    PanicHandler: func(c fiber.Ctx, r any) error {
        // Log to monitoring service
        monitoring.LogError(r)
        // Return generic error
        return c.Status(500).JSON(fiber.Map{
            "error": "Internal Server Error",
        })
    },
}))

Development with Stack Traces

if os.Getenv("ENV") == "development" {
    app.Use(recover.New(recover.Config{
        EnableStackTrace: true,
        PanicHandler: func(c fiber.Ctx, r any) error {
            return c.Status(500).JSON(fiber.Map{
                "error": fmt.Sprintf("%v", r),
                "stack": string(debug.Stack()),
            })
        },
    }))
} else {
    app.Use(recover.New())
}

Custom Error Response Format

app.Use(recover.New(recover.Config{
    PanicHandler: func(c fiber.Ctx, r any) error {
        return c.Status(500).JSON(fiber.Map{
            "success": false,
            "message": "An unexpected error occurred",
            "error":   fmt.Sprintf("%v", r),
        })
    },
}))

Best Practices

Register Early

// Register recover middleware FIRST to catch all panics
app.Use(recover.New())

// Then register other middleware
app.Use(logger.New())

// Finally register routes
app.Get("/", handler)

Combine with Error Handling

app.Use(recover.New(recover.Config{
    PanicHandler: func(c fiber.Ctx, r any) error {
        // Convert panic to error
        err := fmt.Errorf("panic: %v", r)
        // Use app's error handler
        return err
    },
}))

Notes

  • This middleware should be registered early in the middleware chain to catch panics from subsequent middleware and handlers
  • Stack traces are only collected when EnableStackTrace is enabled to avoid performance overhead
  • The default panic handler returns a simple 500 status with “Internal Server Error” message

Build docs developers (and LLMs) love