github.com/gofiber/fiber/v2@v2.47.0/middleware/recover/recover.go (about) 1 package recover //nolint:predeclared // TODO: Rename to some non-builtin 2 3 import ( 4 "fmt" 5 "os" 6 "runtime/debug" 7 8 "github.com/gofiber/fiber/v2" 9 ) 10 11 func defaultStackTraceHandler(_ *fiber.Ctx, e interface{}) { 12 _, _ = os.Stderr.WriteString(fmt.Sprintf("panic: %v\n%s\n", e, debug.Stack())) //nolint:errcheck // This will never fail 13 } 14 15 // New creates a new middleware handler 16 func New(config ...Config) fiber.Handler { 17 // Set default config 18 cfg := configDefault(config...) 19 20 // Return new handler 21 return func(c *fiber.Ctx) (err error) { //nolint:nonamedreturns // Uses recover() to overwrite the error 22 // Don't execute middleware if Next returns true 23 if cfg.Next != nil && cfg.Next(c) { 24 return c.Next() 25 } 26 27 // Catch panics 28 defer func() { 29 if r := recover(); r != nil { 30 if cfg.EnableStackTrace { 31 cfg.StackTraceHandler(c, r) 32 } 33 34 var ok bool 35 if err, ok = r.(error); !ok { 36 // Set error that will call the global error handler 37 err = fmt.Errorf("%v", r) 38 } 39 } 40 }() 41 42 // Return err if exist, else move to next handler 43 return c.Next() 44 } 45 }