package xerr import ( "context" log "kpt-tmr-group/pkg/logger/logrus" "kpt-tmr-group/pkg/runtimeutil" "kpt-tmr-group/pkg/sentry" "strings" ) // 自定义处理过的函数放置在这里 // ReportError 顶层函数需要主动调用这个进行错误日志上报和报警 func ReportError(ctx context.Context, err error, messages ...string) error { if err == nil { return nil } originErr := Cause(err) if originErr == nil { return nil } // 忽略业务自定义错误 _, ok := originErr.(*CustomError) if ok { return nil } e := Wrap(err, messages...) // 上报错误到 Sentry 记录错误 sentry.ReportPanic(ctx, e) // 打个错误堆栈日志 log.Errorf("%+v", e) return e } // ReportSentry 顶层函数需要主动调用这个进行错误日志上报 func ReportSentry(ctx context.Context, err error, messages ...string) { if err == nil { return } // 忽略业务自定义错误 _, ok := Cause(err).(*CustomError) if ok { return } // 上报错误到 Sentry 记录错误 e := Wrap(err, messages...) // sentry.ReportError(ctx, e) // 打个错误堆栈日志 log.Errorf("%+v", e) return } func getOperation(skip int, operations ...string) string { if len(operations) == 0 { return runtimeutil.CallerFuncName(skip + 1) } return operations[0] } // WithMessage annotates err with a new message. // If err is nil, WithMessage returns nil. // 如果不传 message,默认会将调用函数写入 message func WithMessage(err error, messages ...string) error { if err == nil { return nil } return &withMessage{ cause: err, msg: buildMessage(messages...), } } // LogWithWrap returns an error annotating err with a stack trace // at the point Wrap is called, and the supplied message. // If err is nil, Wrap returns nil. // NOTE: 这个默认打错误日志哦 func WrapWithLog(err error, messages ...string) error { if err == nil { return nil } err = &withStack{ &withMessage{ cause: err, msg: buildMessage(messages...), }, callersWithErr(err), } log.Errorf("%+v", err) return err } // Wrap returns an error annotating err with a stack trace // at the point Wrap is called, and the supplied message. // If err is nil, Wrap returns nil. func Wrap(err error, messages ...string) error { if err == nil { return nil } return &withStack{ &withMessage{ cause: err, msg: buildMessage(messages...), }, callersWithErr(err), } } func buildMessage(messages ...string) string { if len(messages) == 0 { return runtimeutil.CallerFuncPos(2) } return strings.Join(messages, " ") } // StackWithLog annotates err with a stack trace at the point WithStack was called. // If err is nil, WithStack returns nil. // NOTE: 这个默认打错误日志哦 func StackWithLog(err error) error { err = wrapStack(err, 1) if err != nil { log.Errorf("%+s", err) } return err } // WithStack annotates err with a stack trace at the point WithStack was called. // If err is nil, WithStack returns nil. // NOTE: 这个没有打日志哦 func Stack(err error) error { return wrapStack(err, 1) } // ErrorEqual 判断 err 是否为 errors 某一个错误 func ErrorEqual(err error, errors ...error) bool { root := Cause(err) if root == nil { return false } for _, e := range errors { if root.Error() == e.Error() { return true } } return false }