github.com/sandwich-go/boost@v1.3.29/xerror/xerror_interface.go (about) 1 package xerror 2 3 // APICode Code feature. 4 type APICode interface { 5 error 6 Code() int32 7 } 8 9 // apiStack Stack feature. 10 type apiStack interface { 11 error 12 Stack() string 13 } 14 15 // apiCaller Caller feature. 16 type apiCaller interface { 17 error 18 Caller(skip int) (file, funcName string, line int) 19 } 20 21 // apiCause Cause feature. 22 type apiCause interface { 23 Error() string 24 Cause() error 25 } 26 27 // apiLogic Logic Exception feature. 28 type apiLogic interface { 29 Error() string 30 Logic() bool 31 } 32 33 // Code 返回错误码数据,如果没有实现APICode则根据CodeHandlerForNotAPICode逻辑返回 34 func Code(err error) int32 { 35 if err != nil { 36 if e, ok := err.(APICode); ok { 37 return e.Code() 38 } 39 } 40 return CodeHandlerForNotAPICode(err) 41 } 42 43 // Caller 返回调用信息 44 func Caller(err error, skip int) (file, funcName string, line int) { 45 if err == nil { 46 return 47 } 48 if e, ok := err.(apiCaller); ok { 49 return e.Caller(skip) 50 } 51 return 52 } 53 54 // Logic 返回是否是Logic层异常,默认为false 55 func Logic(err error) bool { 56 if err == nil { 57 return false 58 } 59 if e, ok := err.(apiLogic); ok { 60 return e.Logic() 61 } 62 // 兼容err2接口 63 if e, ok := err.(interface{ IsLogicException() bool }); ok { 64 return e.IsLogicException() 65 } 66 return false 67 } 68 69 // Cause 返回最底层的错误信息,如果没有实现apiCause,则返回当前错误信息 70 func Cause(err error) error { 71 if err != nil { 72 if e, ok := err.(apiCause); ok { 73 return e.Cause() 74 } 75 } 76 return err 77 } 78 79 // Stack 返回堆栈信息,如果err不支持apiStack,则返回错误本身数据 80 func Stack(err error) string { 81 if err == nil { 82 return "" 83 } 84 if e, ok := err.(apiStack); ok { 85 return e.Stack() 86 } 87 return err.Error() 88 }