支持打印堆栈

This commit is contained in:
白茶清欢 2024-09-30 16:13:43 +08:00
parent e8561a060c
commit 1e7f84ed84
4 changed files with 55 additions and 26 deletions

View File

@ -16,15 +16,17 @@ type IException interface {
// Error 兼容 go 内置 error // Error 兼容 go 内置 error
Error() string Error() string
// GetCode 获取错误码 // GetCode 获取错误码
GetCode() interface{} GetCode() any
// GetMessage *获取错误信息 // GetMessage *获取错误信息
GetMessage() string GetMessage() string
// GetData 获取异常时的返回数据 // GetData 获取异常时的返回数据
GetData() interface{} GetData() any
// GetHttpCode 获取当前异常要返回的http状态码, 不设置则 默认 200 // GetHttpCode 获取当前异常要返回的http状态码, 不设置则 默认 200
GetHttpCode() int GetHttpCode() int
// ToError 转换为内置error类型 // ToError 转换为内置error类型
ToError() error ToError() error
// IsCode 是否为指定code // IsCode 是否为指定code
IsCode(code interface{}) bool IsCode(code any) bool
// GetStack 获取调用堆栈
GetStack() string
} }

16
code.go
View File

@ -18,13 +18,13 @@ var (
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 20:53 2022/6/25 // Date : 20:53 2022/6/25
codeTable map[interface{}]Code codeTable map[any]Code
codeList []Code codeList []Code
) )
func init() { func init() {
// 规避没调用 InitCodeTable 导致空指针 // 规避没调用 InitCodeTable 导致空指针
codeTable = make(map[interface{}]Code) codeTable = make(map[any]Code)
codeList = make([]Code, 0) codeList = make([]Code, 0)
} }
@ -33,7 +33,7 @@ func init() {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 20:55 2022/6/25 // 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 { for code, message := range table {
c := Code{ c := Code{
Value: code, Value: code,
@ -59,7 +59,7 @@ func InitCodeTableWithMessage(table map[interface{}]map[string]string, convertDe
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 16:19 2023/6/9 // Date : 16:19 2023/6/9
func InitCodeTableWithCodeList(list []Code, convertDefaultSuccessCode interface{}, convertDefaultLanguage string) { func InitCodeTableWithCodeList(list []Code, convertDefaultSuccessCode any, convertDefaultLanguage string) {
codeList = list codeList = list
for _, itemCode := range list { for _, itemCode := range list {
if nil == itemCode.Reason { if nil == itemCode.Reason {
@ -96,7 +96,7 @@ var (
// defaultHttpCode 默认的http状态码 // defaultHttpCode 默认的http状态码
defaultHttpCode = http.StatusOK defaultHttpCode = http.StatusOK
// defaultSuccessCode 默认代表成功的状态码 // defaultSuccessCode 默认代表成功的状态码
defaultSuccessCode interface{} defaultSuccessCode any
// defaultLanguage 默认的语言 // defaultLanguage 默认的语言
defaultLanguage = "zh" defaultLanguage = "zh"
) )
@ -115,7 +115,7 @@ func MessageWithoutCode() {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:16 2022/6/25 // Date : 21:16 2022/6/25
func getMessage(code interface{}, defaultMessage ...string) string { func getMessage(code any, defaultMessage ...string) string {
inputCodeInfo, exist := codeTable[code] inputCodeInfo, exist := codeTable[code]
if !exist { if !exist {
if len(defaultMessage) > 0 && len(defaultMessage[0]) > 0 { if len(defaultMessage) > 0 && len(defaultMessage[0]) > 0 {
@ -139,7 +139,7 @@ func getMessage(code interface{}, defaultMessage ...string) string {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 12:58 2022/6/26 // Date : 12:58 2022/6/26
func GetMessage(code interface{}, defaultMessage ...string) string { func GetMessage(code any, defaultMessage ...string) string {
return getMessage(code, defaultMessage...) return getMessage(code, defaultMessage...)
} }
@ -157,6 +157,6 @@ func GetCodeList() []Code {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 18:05 2023/6/9 // Date : 18:05 2023/6/9
func GetCodeTable() map[interface{}]Code { func GetCodeTable() map[any]Code {
return codeTable return codeTable
} }

View File

@ -13,7 +13,7 @@ package exception
// //
// Date : 15:55 2023/6/9 // Date : 15:55 2023/6/9
type Code struct { type Code struct {
Value interface{} `json:"value"` // 状态码的值 Value any `json:"value"` // 状态码的值
Message map[string]string `json:"message"` // 状态码对应的文案(key -> 语言 , value -> 对应语言的描述) Message map[string]string `json:"message"` // 状态码对应的文案(key -> 语言 , value -> 对应语言的描述)
Reason []*CodeReason `json:"reason"` // 产生此错误码的原因描述(key -> 语言 , value -> 对应语言的原因列表) Reason []*CodeReason `json:"reason"` // 产生此错误码的原因描述(key -> 语言 , value -> 对应语言的原因列表)
} }

View File

@ -10,6 +10,9 @@ package exception
import ( import (
"errors" "errors"
"fmt" "fmt"
"runtime"
"strconv"
"strings"
) )
// Exception 异常接口的具体实现 // Exception 异常接口的具体实现
@ -18,17 +21,22 @@ import (
// //
// Date *: 21:09 2022/6/25 // Date *: 21:09 2022/6/25
type Exception struct { type Exception struct {
code interface{} code any
message string message string
httpCode int httpCode int
data interface{} data any
stack string
} }
func (e *Exception) Error() string { func (e *Exception) Error() string {
return e.GetMessage() return e.GetMessage()
} }
func (e *Exception) GetCode() interface{} { func (e *Exception) GetStack() string {
return e.stack
}
func (e *Exception) GetCode() any {
return e.code return e.code
} }
@ -36,7 +44,7 @@ func (e *Exception) GetMessage() string {
return e.message return e.message
} }
func (e *Exception) GetData() interface{} { func (e *Exception) GetData() any {
return e.data return e.data
} }
@ -56,7 +64,7 @@ func (e *Exception) ToError() error {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 00:39 2023/9/28 // Date : 00:39 2023/9/28
func (e *Exception) IsCode(inputCode interface{}) bool { func (e *Exception) IsCode(inputCode any) bool {
return fmt.Sprintf("%v", inputCode) == fmt.Sprintf("%v", e.GetCode()) return fmt.Sprintf("%v", inputCode) == fmt.Sprintf("%v", e.GetCode())
} }
@ -65,7 +73,7 @@ func (e *Exception) IsCode(inputCode interface{}) bool {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:22 2022/6/25 // Date : 21:22 2022/6/25
func NewWithCode(code interface{}) IException { func NewWithCode(code any) IException {
return New(code, defaultHttpCode, nil, "") return New(code, defaultHttpCode, nil, "")
} }
@ -74,7 +82,7 @@ func NewWithCode(code interface{}) IException {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:25 2022/6/25 // Date : 21:25 2022/6/25
func NewWithCodeAndHttpCode(code interface{}, httpCode int) IException { func NewWithCodeAndHttpCode(code any, httpCode int) IException {
return New(code, httpCode, nil, "") return New(code, httpCode, nil, "")
} }
@ -83,7 +91,7 @@ func NewWithCodeAndHttpCode(code interface{}, httpCode int) IException {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:28 2022/6/25 // Date : 21:28 2022/6/25
func NewWithCodeAndData(code interface{}, data interface{}) IException { func NewWithCodeAndData(code any, data map[string]any) IException {
return New(code, defaultHttpCode, data, "") return New(code, defaultHttpCode, data, "")
} }
@ -92,16 +100,35 @@ func NewWithCodeAndData(code interface{}, data interface{}) IException {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:28 2022/6/25 // Date : 21:28 2022/6/25
func New(code interface{}, httpCode int, data interface{}, defaultMessage ...string) IException { func New(code any, httpCode int, data any, defaultMessage ...string) IException {
if nil == data { if nil == data {
// 保证数据结构的一致性, 同时避免后续使用出现空指针 // 保证数据结构的一致性, 同时避免后续使用出现空指针
data = map[string]interface{}{} data = map[string]any{}
}
pcs := make([]uintptr, 128)
n := runtime.Callers(2, pcs)
frames := runtime.CallersFrames(pcs[:n])
var sb strings.Builder
for {
frame, more := frames.Next()
sb.WriteString(frame.Function)
sb.WriteByte('\n')
sb.WriteByte('\t')
sb.WriteString(frame.File)
sb.WriteByte(':')
sb.WriteString(strconv.Itoa(frame.Line))
sb.WriteByte('\n')
if !more {
break
}
} }
return &Exception{ return &Exception{
code: code, code: code,
message: getMessage(code, defaultMessage...), message: getMessage(code, defaultMessage...),
httpCode: httpCode, httpCode: httpCode,
data: data, data: data,
stack: sb.String(),
} }
} }
@ -110,11 +137,11 @@ func New(code interface{}, httpCode int, data interface{}, defaultMessage ...str
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:36 2022/6/25 // Date : 21:36 2022/6/25
func NewFromError(code interface{}, err error) IException { func NewFromError(code any, err error) IException {
if nil == err { if nil == err {
return nil return nil
} }
return New(code, defaultHttpCode, map[string]interface{}{ return New(code, defaultHttpCode, map[string]any{
"error": err.Error(), "error": err.Error(),
}, err.Error()) }, err.Error())
} }
@ -124,7 +151,7 @@ func NewFromError(code interface{}, err error) IException {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 22:25 2023/2/11 // Date : 22:25 2023/2/11
func NewFromMessage(code interface{}, message string) IException { func NewFromMessage(code any, message string) IException {
if len(message) == 0 { if len(message) == 0 {
message = getMessage(code, fmt.Sprintf("%v -> 未知异常信息", code)) message = getMessage(code, fmt.Sprintf("%v -> 未知异常信息", code))
} }
@ -157,6 +184,6 @@ func IsSuccess(e *Exception) bool {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 22:35 2022/6/25 // Date : 22:35 2022/6/25
func NewSuccess(data interface{}) IException { func NewSuccess(data any) IException {
return New(defaultSuccessCode, defaultHttpCode, data, "") return New(defaultSuccessCode, defaultHttpCode, data, "")
} }