/
Error.go
109 lines (89 loc) · 2.44 KB
/
Error.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package lib
import (
"fmt"
)
var (
//多语言时指定默认语言
DEFAULT_LANG = "CN"
//成功
ERR_SUC = &Error{0, "OK"}
//系统错误码
ERR_SYSTEM = &Error{10, "系统错误"}
ERR_METHOD_INVALID = &Error{11, "请求不合法: %+v"}
ERR_FREQ = &Error{12, "接口访问过于频繁: %+v"}
ERR_RPCAUTH = &Error{13, "rpc认证失败:%+v"}
ERR_OTHER = &Error{14, "%+v"}
//业务级别错误码,需要定义到业务代码中
//ERR_USER_NOT_EXIST = &Error{1101, "用户不存在: %s"}
)
type Error struct {
Code int
Msg interface{}
}
func (this *Error) GetCode() int {
return this.Code
}
func (this *Error) GetMessage() string {
return fmt.Sprint(this.Msg)
}
func (this *Error) Error() string {
return fmt.Sprint(this.Msg)
}
//格式化输出错误信息
//用于 Interceptor 拦截抛错
//国际化产品,多语言时,Msg 可以设置为map[string]string ,如:{"CN":"系统错误", "EN":"system error"}
type Errorf struct {
Code int
Msg interface{}
fmts []interface{}
data map[string]interface{}
}
func (this *Errorf) GetCode() int {
return this.Code
}
func (this *Errorf) GetMessage(langs ...string) string { // {{{
if len(this.fmts) > 0 {
//fmts的可用值为string, 若fmts最后一个值为map, 则认为它是异常时返回的data
if data, ok := this.fmts[len(this.fmts)-1].(map[string]interface{}); ok {
this.fmts = this.fmts[0 : len(this.fmts)-1]
this.data = data
}
}
if msg, ok := this.Msg.(string); ok {
return fmt.Sprintf(msg, this.fmts...)
} else if global_msg, ok := this.Msg.(map[string]string); ok {
lang := ""
if len(langs) > 0 {
lang = langs[0]
}
if lang != "" {
if msg, ok := global_msg[lang]; ok {
return fmt.Sprintf(msg, this.fmts...)
}
}
if msg, ok := global_msg[DEFAULT_LANG]; ok {
return fmt.Sprintf(msg, this.fmts...)
}
for _, v := range global_msg {
return fmt.Sprintf(v, this.fmts...)
}
}
return fmt.Sprint(this.Msg)
} // }}}
func (this *Errorf) GetData() map[string]interface{} {
if this.data == nil && len(this.fmts) > 0 {
if data, ok := this.fmts[len(this.fmts)-1].(map[string]interface{}); ok {
return data
}
}
return this.data
}
func (this *Errorf) Error() string {
return this.GetMessage()
}
//捕获异常时,可同时返回data(通过fmts参数最后一个类型为map的值)
func Interceptor(guard bool, errmsg *Error, fmts ...interface{}) {
if !guard {
panic(&Errorf{errmsg.Code, errmsg.Msg, fmts, nil})
}
}