code.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package codes
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. "github.com/go-kratos/kratos/v2/errors"
  7. )
  8. func Error(code int, msg string) error {
  9. e := errors.New(400, "", msg)
  10. e = e.WithMetadata(map[string]string{
  11. "code": fmt.Sprint(code),
  12. })
  13. return e
  14. }
  15. func ErrorData(code int, msg string, data interface{}) error {
  16. j, _ := json.Marshal(data)
  17. e := errors.New(400, string(j), msg)
  18. e = e.WithMetadata(map[string]string{
  19. "code": fmt.Sprint(code),
  20. })
  21. return e
  22. }
  23. func CommonError(err error) error {
  24. se := errors.FromError(err)
  25. if se == nil {
  26. return Error(10400, err.Error())
  27. }
  28. return se
  29. }
  30. func SystemErr(msg string) error {
  31. return Error(10500, msg)
  32. }
  33. // Customize 自定义返回值. 如自己重定向
  34. func Customize() error {
  35. return Error(1000, "")
  36. }
  37. func ParseErrorWithData(err error, data interface{}) (int, string) {
  38. st := errors.FromError(err)
  39. if st == nil {
  40. return 0, err.Error()
  41. }
  42. message := st.Message
  43. metadata := st.GetMetadata()
  44. code := st.Code
  45. if _, ok := metadata["code"]; ok {
  46. _code, _ := strconv.Atoi(metadata["code"])
  47. code = int32(_code)
  48. }
  49. if data != nil {
  50. if st.Reason != "" {
  51. json.Unmarshal([]byte(st.Reason), data)
  52. }
  53. }
  54. return int(code), message
  55. }
  56. func ParseError(err error) (int, string) {
  57. return ParseErrorWithData(err, nil)
  58. }
  59. func ParseErrorMsg(err error) string {
  60. _, msg := ParseErrorWithData(err, nil)
  61. return msg
  62. }
  63. func ErrorEqual(err1 error, err2 error) bool {
  64. code1, msg1 := ParseError(err1)
  65. code2, msg2 := ParseError(err2)
  66. if code1 == 0 && code2 == 0 {
  67. if msg1 == msg2 {
  68. return true
  69. }
  70. return false
  71. }
  72. if code1 == code2 {
  73. return true
  74. }
  75. return false
  76. }