github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/middlewares/recover.go (about) 1 package middlewares 2 3 import ( 4 "fmt" 5 "net/http" 6 "runtime" 7 8 "github.com/ngocphuongnb/tetua/app/logger" 9 "github.com/ngocphuongnb/tetua/app/server" 10 ) 11 12 func Recover(c server.Context) error { 13 defer func() { 14 if r := recover(); r != nil { 15 err, ok := r.(error) 16 if !ok { 17 err = fmt.Errorf("%v", r) 18 } 19 stack := make([]byte, 4<<10) 20 length := runtime.Stack(stack, true) 21 msg := fmt.Sprintf("%v %s\n", err, stack[:length]) 22 c.Logger().Error(msg, logger.Context{"recovered": true}) 23 if err := c.Status(http.StatusBadRequest).Json(map[string]string{"error": err.Error()}); err != nil { 24 c.Logger().Error(err) 25 } 26 } 27 }() 28 29 return c.Next() 30 }