package middleware import ( "errors" "fmt" "git.inspur.com/sbg-jszt/cfn/cfn-schedule/config" e "git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/pkg/errors" response2 "git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/pkg/response" "git.inspur.com/sbg-jszt/cfn/cfn-schedule/pkg/log" "github.com/gin-gonic/gin" "net/http" "strings" ) // CustomRecovery 自定义错误 (panic) 拦截中间件、对可能发生的错误进行拦截、统一记录 func CustomRecovery() gin.HandlerFunc { DefaultErrorWriter := &PanicExceptionRecord{} return gin.RecoveryWithWriter(DefaultErrorWriter, func(c *gin.Context, err interface{}) { // 这里针对发生的panic等异常进行统一响应即 // 这里针对发生的panic等异常进行统一响应即 errStr := "" if config.Config.Debug == true { errStr = fmt.Sprintf("%v", err) } response2.Resp().SetHttpCode(http.StatusInternalServerError).FailCode(c, e.ServerError, errStr) }) } // PanicExceptionRecord panic等异常记录 type PanicExceptionRecord struct{} func (p *PanicExceptionRecord) Write(b []byte) (n int, err error) { s1 := "An error occurred in the server's internal code:" var build strings.Builder build.WriteString(s1) build.Write(b) errStr := build.String() log.Error(errStr) return len(errStr), errors.New(errStr) }