|
1 | 1 | package httper |
2 | 2 |
|
3 | 3 | import ( |
4 | | -"fmt" |
5 | 4 | "net/http" |
6 | 5 |
|
7 | 6 | "github.com/gin-gonic/gin" |
8 | | -"github.com/pkg/errors" |
9 | 7 |
|
10 | 8 | "base/logger" |
| 9 | +"base/mistake" |
11 | 10 | "base/validator" |
12 | 11 | ) |
13 | 12 |
|
14 | | -// 统一处理异常,统一处理日志,统一处理返回 |
15 | | -func HandleResponse(c *gin.Context, err error, data interface{}) { |
16 | | -// 如果没有错误,就是正常请求 |
17 | | -if err == nil { |
18 | | -SendResponseSuccess(c, "操作成功", data) |
19 | | -return |
20 | | -} |
21 | | - |
22 | | -// 针对不同的错误类型进行处理 |
23 | | -switch errors.Cause(err).(type) { |
24 | | -default: |
25 | | -logStackInfo(err) |
26 | | -SendResponseFail(c, http.StatusBadRequest, err.Error()) |
27 | | -} |
28 | | - |
29 | | -return |
30 | | -} |
31 | | - |
32 | 13 | // 绑定参数并验证参数 |
33 | 14 | // true: 确实存在问题,会返回400错误 |
34 | 15 | // false: 不存在问题,验证通过 |
35 | 16 | func BindAndCheck(ctx *gin.Context, data interface{}) bool { |
36 | 17 | // 参数映射 |
37 | 18 | if err := ctx.Bind(data); err != nil { |
38 | | -HandleResponse(ctx, err, nil) |
| 19 | +HandleResponse(ctx, mistake.NewReqErr("请求参数绑定异常"), nil) |
39 | 20 | return true |
40 | 21 | } |
41 | 22 |
|
42 | 23 | // 验证参数 |
43 | 24 | if err := validator.GlobalValidate.Check(data); err != nil { |
44 | | -HandleResponse(ctx, err, nil) |
| 25 | +HandleResponse(ctx, mistake.NewReqErr(err.Error()), nil) |
45 | 26 | return true |
46 | 27 | } |
47 | 28 |
|
48 | 29 | return false |
49 | 30 | } |
50 | 31 |
|
51 | | -// 堆栈信息接口用于内部转换使用 |
52 | | -type stackTracer interface { |
53 | | -StackTrace() errors.StackTrace |
54 | | -} |
| 32 | +// 统一处理异常,统一处理日志,统一处理返回 |
| 33 | +func HandleResponse(c *gin.Context, err error, data interface{}) { |
| 34 | +// 如果没有错误,就是正常请求 |
| 35 | +if err == nil { |
| 36 | +SendResponseSuccess(c, "操作成功", data) |
| 37 | +return |
| 38 | +} |
55 | 39 |
|
56 | | -// 判断如果包含堆栈信息的封装就打印出相关堆栈信息,如果没有封装就打印原本错误信息 |
57 | | -func logStackInfo(err error) { |
58 | | -if e, ok := err.(stackTracer); ok { |
59 | | -stacks := e.StackTrace() |
60 | | -var stackEntries []string |
61 | | -for _, v := range stacks { |
62 | | -stackEntries = append(stackEntries, fmt.Sprintf("%+v", v)) |
| 40 | +// 针对不同的错误类型进行处理 |
| 41 | +switch err.(type) { |
| 42 | +// 如果是请求参数异常,返回 400 直接返回err的错误信息 |
| 43 | +case *mistake.ReqErr: |
| 44 | +SendResponseFail(c, http.StatusBadRequest, err.Error()) |
| 45 | + |
| 46 | +// 服务异常错误,返回 400 返回err的错误message信息,并打印日志记录 |
| 47 | +case *mistake.ServiceErr: |
| 48 | +e := err.(*mistake.ServiceErr) |
| 49 | +if e.Err == nil { |
| 50 | +logger.Error(e.Message, "\n", e.Stack) |
| 51 | +} else { |
| 52 | +logger.Error(e.Message, "\n", e.Err, "\n", e.Stack) |
63 | 53 | } |
64 | | -logger.Error(stackEntries) |
65 | | -} else { |
66 | | -logger.Error(err) |
| 54 | +SendResponseFail(c, http.StatusBadRequest, e.Message) |
| 55 | + |
| 56 | +// 数据层异常,返回 400 打印错误日志记录,这个错误信息不能返回到前端 |
| 57 | +case *mistake.DaoErr: |
| 58 | +e := err.(*mistake.DaoErr) |
| 59 | +logger.Error(e.Err, "\n", e.Stack) |
| 60 | +SendResponseFail(c, http.StatusBadRequest, "数据异常") |
| 61 | + |
| 62 | +// 未知错误,返回 500,证明此错误没有进行包装,直接被返回 |
| 63 | +default: |
| 64 | +logger.Error(err, logger.LogStack(0, 0)) |
| 65 | +SendResponseFail(c, http.StatusInternalServerError, "服务器端异常") |
67 | 66 | } |
| 67 | +return |
68 | 68 | } |
0 commit comments