package codes import ( "encoding/json" "fmt" "strconv" "github.com/go-kratos/kratos/v2/errors" ) func Error(code int, msg string) error { e := errors.New(400, "", msg) e = e.WithMetadata(map[string]string{ "code": fmt.Sprint(code), }) return e } func ErrorData(code int, msg string, data interface{}) error { j, _ := json.Marshal(data) e := errors.New(400, string(j), msg) e = e.WithMetadata(map[string]string{ "code": fmt.Sprint(code), }) return e } func CommonError(err error) error { se := errors.FromError(err) if se == nil { return Error(10400, err.Error()) } return se } func SystemErr(msg string) error { return Error(10500, msg) } // Customize 自定义返回值. 如自己重定向 func Customize() error { return Error(1000, "") } func ParseErrorWithData(err error, data interface{}) (int, string) { st := errors.FromError(err) if st == nil { return 0, err.Error() } message := st.Message metadata := st.GetMetadata() code := st.Code if _, ok := metadata["code"]; ok { _code, _ := strconv.Atoi(metadata["code"]) code = int32(_code) } if data != nil { if st.Reason != "" { json.Unmarshal([]byte(st.Reason), data) } } return int(code), message } func ParseError(err error) (int, string) { return ParseErrorWithData(err, nil) } func ParseErrorMsg(err error) string { _, msg := ParseErrorWithData(err, nil) return msg } func ErrorEqual(err1 error, err2 error) bool { code1, msg1 := ParseError(err1) code2, msg2 := ParseError(err2) if code1 == 0 && code2 == 0 { if msg1 == msg2 { return true } return false } if code1 == code2 { return true } return false }