diff --git a/abstrace.go b/abstrace.go index a266b4a..186e077 100644 --- a/abstrace.go +++ b/abstrace.go @@ -15,16 +15,14 @@ package exception type IException interface { // Error 兼容 go 内置 error Error() string - // GetCode 获取错误码 - GetCode() interface{} - // GetMessage *获取错误信息 - GetMessage() string - // GetData 获取异常时的返回数据 - GetData() interface{} - // GetHttpCode 获取当前异常要返回的http状态码, 不设置则 默认 200 - GetHttpCode() int + // Code 获取错误码 + Code() any + // Message 获取错误信息 + Message() string + // Data 获取异常时的返回数据 + Data() map[string]any // ToError 转换为内置error类型 ToError() error // IsCode 是否为指定code - IsCode(code interface{}) bool + IsCode(code any) bool } diff --git a/code.go b/code.go index 1c0f6e0..ba36ea3 100644 --- a/code.go +++ b/code.go @@ -9,7 +9,6 @@ package exception import ( "fmt" - "net/http" ) var ( @@ -18,13 +17,13 @@ var ( // Author : go_developer@163.com<白茶清欢> // // Date : 20:53 2022/6/25 - codeTable map[interface{}]Code + codeTable map[any]Code codeList []Code ) func init() { // 规避没调用 InitCodeTable 导致空指针 - codeTable = make(map[interface{}]Code) + codeTable = make(map[any]Code) codeList = make([]Code, 0) } @@ -33,12 +32,13 @@ func init() { // Author : go_developer@163.com<白茶清欢> // // Date : 20:55 2022/6/25 -func InitCodeTableWithMessage(table map[interface{}]map[string]string, convertDefaultSuccessCode interface{}, convertDefaultLanguage string) { +func InitCodeTableWithMessage(table map[any]map[string]string, convertDefaultSuccessCode any, convertDefaultLanguage string) { for code, message := range table { c := Code{ Value: code, Message: message, - Reason: make([]*CodeReason, 0), + Reason: make(map[string]string), + Resolve: make(map[string]string), } codeTable[code] = c @@ -59,23 +59,11 @@ func InitCodeTableWithMessage(table map[interface{}]map[string]string, convertDe // Author : go_developer@163.com<白茶清欢> // // Date : 16:19 2023/6/9 -func InitCodeTableWithCodeList(list []Code, convertDefaultSuccessCode interface{}, convertDefaultLanguage string) { +func InitCodeTableWithCodeList(list []Code, convertDefaultSuccessCode any, convertDefaultLanguage string) { codeList = list for _, itemCode := range list { if nil == itemCode.Reason { - itemCode.Reason = make([]*CodeReason, 0) - } - - for lang, _ := range itemCode.Message { - for _, itemReason := range itemCode.Reason { - if _, exist := itemReason.Reason[lang]; !exist { - continue - } - if _, exist := itemReason.Solution[lang]; !exist { - itemReason.Solution[lang] = make([]string, 0) - } - } - + itemCode.Reason = make(map[string]string) } codeTable[itemCode.Value] = itemCode @@ -93,10 +81,8 @@ func InitCodeTableWithCodeList(list []Code, convertDefaultSuccessCode interface{ var ( // messageWithCode 自动在message文案后追加状态码 messageWithCode = true - // defaultHttpCode 默认的http状态码 - defaultHttpCode = http.StatusOK // defaultSuccessCode 默认代表成功的状态码 - defaultSuccessCode interface{} + defaultSuccessCode any // defaultLanguage 默认的语言 defaultLanguage = "zh" ) @@ -110,39 +96,34 @@ func MessageWithoutCode() { messageWithCode = false } -// getMessage 根据code获取文案 +// GetMessage 根据code获取文案 // // Author : go_developer@163.com<白茶清欢> // // Date : 21:16 2022/6/25 -func getMessage(code interface{}, defaultMessage ...string) string { - inputCodeInfo, exist := codeTable[code] - if !exist { +func GetMessage(code any, defaultMessage ...string) string { + var ( + inputCodeInfo Code + exist bool + ) + if inputCodeInfo, exist = codeTable[code]; !exist { + // 错误码不存在 if len(defaultMessage) > 0 && len(defaultMessage[0]) > 0 { return defaultMessage[0] } // 无论是否开启 messageWithCode , 未知错误强行带 code - return fmt.Sprintf("未知错误【%v】", code) + return fmt.Sprintf("unknown error【%v】", code) + } + if code == defaultSuccessCode { + // 请求成功, 一直不带状态码后缀 + return inputCodeInfo.Message[defaultLanguage] } if messageWithCode { - if code == defaultSuccessCode { - // 请求成功, 一直不带状态码后缀 - return inputCodeInfo.Message[defaultLanguage] - } return fmt.Sprintf(inputCodeInfo.Message[defaultLanguage]+"【%v】", code) } return inputCodeInfo.Message[defaultLanguage] } -// GetMessage 获取消息信息 -// -// Author : go_developer@163.com<白茶清欢> -// -// Date : 12:58 2022/6/26 -func GetMessage(code interface{}, defaultMessage ...string) string { - return getMessage(code, defaultMessage...) -} - // GetCodeList ... // // Author : go_developer@163.com<白茶清欢> @@ -157,6 +138,6 @@ func GetCodeList() []Code { // Author : go_developer@163.com<白茶清欢> // // Date : 18:05 2023/6/9 -func GetCodeTable() map[interface{}]Code { +func GetCodeTable() map[any]Code { return codeTable } diff --git a/define.go b/define.go index f22d366..22b17ad 100644 --- a/define.go +++ b/define.go @@ -13,17 +13,8 @@ package exception // // Date : 15:55 2023/6/9 type Code struct { - Value interface{} `json:"value"` // 状态码的值 + Value any `json:"value"` // 状态码的值 Message map[string]string `json:"message"` // 状态码对应的文案(key -> 语言 , value -> 对应语言的描述) - Reason []*CodeReason `json:"reason"` // 产生此错误码的原因描述(key -> 语言 , value -> 对应语言的原因列表) -} - -// CodeReason 错误码的原因 -// -// Author : go_developer@163.com<白茶清欢> -// -// Date : 00:31 2023/11/5 -type CodeReason struct { - Reason map[string]string `json:"reason"` // 错误原因: 语言 => 原因 - Solution map[string][]string `json:"solution"` // 解决步骤. 语言 => 解决步骤 + Reason map[string]string `json:"reason"` // 产生此错误码的原因描述(key -> 语言 , value -> 对应语言的原因列表) + Resolve map[string]string `json:"resolve"` // 解决此错误码的方案描述(key -> 语言 , value -> 对应语言的方案列表) } diff --git a/exception.go b/exception.go index 644d9e7..e940595 100644 --- a/exception.go +++ b/exception.go @@ -18,32 +18,27 @@ import ( // // Date *: 21:09 2022/6/25 type Exception struct { - code interface{} - message string - httpCode int - data interface{} + code any + message string + data map[string]any } func (e *Exception) Error() string { - return e.GetMessage() + return e.Message() } -func (e *Exception) GetCode() interface{} { +func (e *Exception) Code() any { return e.code } -func (e *Exception) GetMessage() string { +func (e *Exception) Message() string { return e.message } -func (e *Exception) GetData() interface{} { +func (e *Exception) Data() map[string]any { return e.data } -func (e *Exception) GetHttpCode() int { - return e.httpCode -} - func (e *Exception) ToError() error { if nil == e { return nil @@ -56,8 +51,8 @@ func (e *Exception) ToError() error { // Author : go_developer@163.com<白茶清欢> // // Date : 00:39 2023/9/28 -func (e *Exception) IsCode(inputCode interface{}) bool { - return fmt.Sprintf("%v", inputCode) == fmt.Sprintf("%v", e.GetCode()) +func (e *Exception) IsCode(inputCode any) bool { + return fmt.Sprintf("%v", inputCode) == fmt.Sprintf("%v", e.Code()) } // NewWithCode 仅使用错误码实例化异常 @@ -65,17 +60,8 @@ func (e *Exception) IsCode(inputCode interface{}) bool { // Author : go_developer@163.com<白茶清欢> // // Date : 21:22 2022/6/25 -func NewWithCode(code interface{}) IException { - return New(code, defaultHttpCode, nil, "") -} - -// NewWithCodeAndHttpCode 使用 code + http_code 获取实例 -// -// Author : go_developer@163.com<白茶清欢> -// -// Date : 21:25 2022/6/25 -func NewWithCodeAndHttpCode(code interface{}, httpCode int) IException { - return New(code, httpCode, nil, "") +func NewWithCode(code any) IException { + return New(code, map[string]any{}, "") } // NewWithCodeAndData 使用 code + data 获取异常实例 @@ -83,8 +69,8 @@ func NewWithCodeAndHttpCode(code interface{}, httpCode int) IException { // Author : go_developer@163.com<白茶清欢> // // Date : 21:28 2022/6/25 -func NewWithCodeAndData(code interface{}, data interface{}) IException { - return New(code, defaultHttpCode, data, "") +func NewWithCodeAndData(code any, data map[string]any) IException { + return New(code, data, "") } // New 获取异常实例 @@ -92,16 +78,15 @@ func NewWithCodeAndData(code interface{}, data interface{}) IException { // Author : go_developer@163.com<白茶清欢> // // Date : 21:28 2022/6/25 -func New(code interface{}, httpCode int, data interface{}, defaultMessage ...string) IException { +func New(code any, data map[string]any, defaultMessage ...string) IException { if nil == data { // 保证数据结构的一致性, 同时避免后续使用出现空指针 - data = map[string]interface{}{} + data = map[string]any{} } return &Exception{ - code: code, - message: getMessage(code, defaultMessage...), - httpCode: httpCode, - data: data, + code: code, + message: GetMessage(code, defaultMessage...), + data: data, } } @@ -110,12 +95,12 @@ func New(code interface{}, httpCode int, data interface{}, defaultMessage ...str // Author : go_developer@163.com<白茶清欢> // // Date : 21:36 2022/6/25 -func NewFromError(code interface{}, err error) IException { +func NewFromError(code any, err error) IException { if nil == err { return nil } - return New(code, defaultHttpCode, map[string]interface{}{ - "error": err.Error(), + return New(code, map[string]any{ + "err_msg": err.Error(), }, err.Error()) } @@ -124,32 +109,20 @@ func NewFromError(code interface{}, err error) IException { // Author : go_developer@163.com<白茶清欢> // // Date : 22:25 2023/2/11 -func NewFromMessage(code interface{}, message string) IException { +func NewFromMessage(code any, message string) IException { if len(message) == 0 { - message = getMessage(code, fmt.Sprintf("%v -> 未知异常信息", code)) + message = GetMessage(code, "unknown error") } return NewFromError(code, errors.New(message)) } -// ToError 转换成内置error -// -// Author : go_developer@163.com<白茶清欢> -// -// Date : 21:37 2022/6/25 -func ToError(e *Exception) error { - if nil == e { - return nil - } - return errors.New(e.GetMessage()) -} - // IsSuccess 判断一个异常是否为成功 // // Author : go_developer@163.com<白茶清欢> // // Date : 21:34 2022/6/25 func IsSuccess(e *Exception) bool { - return nil == e || e.GetCode() == defaultSuccessCode + return nil == e || e.IsCode(defaultSuccessCode) } // NewSuccess 代表Success的异常 @@ -157,6 +130,6 @@ func IsSuccess(e *Exception) bool { // Author : go_developer@163.com<白茶清欢> // // Date : 22:35 2022/6/25 -func NewSuccess(data interface{}) IException { - return New(defaultSuccessCode, defaultHttpCode, data, "") +func NewSuccess(data map[string]any) IException { + return New(defaultSuccessCode, data, "") }