api-base/router/middleware/panicCatch.go

54 lines
1.0 KiB
Go

package middleware
import (
"fmt"
"go-api/pkg/context"
apierr "go-api/pkg/errors"
"go-api/pkg/response"
"runtime"
"strings"
)
func ServerPanicCatch() context.CustomHandler {
return func(c *context.C) {
defer func() {
if err := recover(); err != nil {
// show error Stack
// *****
builder := &strings.Builder{}
fmt.Printf("[Server Error Catch]\n")
pc := make([]uintptr, 10)
n := runtime.Callers(1, pc)
frames := runtime.CallersFrames(pc[:n])
for {
frame, more := frames.Next()
builder.WriteString(fmt.Sprintf("%s:%d %s\n", frame.File, frame.Line, frame.Function))
if !more {
break
}
}
// *****
var e *apierr.APIError
if convertedErr, ok := err.(*apierr.APIError); ok {
e = convertedErr
} else {
e = apierr.ErrInternalError
}
code := make([]response.MessageCode, 0)
if c := e.Code(); c != nil {
code = append(code, *c)
}
resp := response.Get(e.Status(), code...)
c.AbortWithStatusJSON(resp.Status, resp.Body)
}
}()
c.Next()
}
}