102 lines
1.7 KiB
Go
102 lines
1.7 KiB
Go
package zerror
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
type ZError struct {
|
|
ErrCode ZErrorCode `json:"err_code,omitempty"`
|
|
ErrMsg string `json:"err_msg,omitempty"`
|
|
errs []error
|
|
}
|
|
|
|
func (e *ZError) Error() string {
|
|
if e == nil {
|
|
return ""
|
|
}
|
|
if e.ErrMsg != "" {
|
|
return fmt.Sprintf("ErrCode:%s; ErrMsg:%s;", e.ErrCode, e.ErrMsg)
|
|
}
|
|
res := ""
|
|
if e.errs == nil || len(e.errs) == 0 {
|
|
return res
|
|
}
|
|
var first = true
|
|
for _, err := range e.errs {
|
|
if first {
|
|
res = err.Error()
|
|
first = false
|
|
} else {
|
|
res += ";" + err.Error()
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
func (e *ZError) Errors() []error {
|
|
if e == nil {
|
|
return nil
|
|
}
|
|
return e.errs
|
|
}
|
|
func (e *ZError) Append(err error) {
|
|
if e == nil || err == nil {
|
|
return
|
|
}
|
|
ze, ok := err.(*ZError)
|
|
if ok {
|
|
e.errs = append(e.errs, ze.errs...)
|
|
} else {
|
|
e.errs = append(e.errs, err)
|
|
}
|
|
}
|
|
|
|
func NewByErr(err ...error) error {
|
|
res := &ZError{
|
|
errs: make([]error, 0),
|
|
}
|
|
for i, e := range err {
|
|
if e == nil {
|
|
continue
|
|
}
|
|
ze, ok := err[i].(*ZError)
|
|
if ok {
|
|
res.errs = append(res.errs, ze.errs...)
|
|
} else {
|
|
res.errs = append(res.errs, err[i])
|
|
}
|
|
}
|
|
if len(res.errs) > 0 {
|
|
return res
|
|
}
|
|
return nil
|
|
}
|
|
func NewByCode(errCode ZErrorCode, errMsg ...string) error {
|
|
msg := ""
|
|
if len(errMsg) > 0 {
|
|
msg = errMsg[0]
|
|
} else {
|
|
msg = getErrMsg(errCode)
|
|
}
|
|
return &ZError{
|
|
ErrCode: errCode,
|
|
ErrMsg: msg,
|
|
}
|
|
}
|
|
func NewByMsg(msg string) error {
|
|
err := errors.New(msg)
|
|
return NewByErr(err)
|
|
}
|
|
func Errors(err error) []error {
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
ze, ok := err.(*ZError)
|
|
if !ok {
|
|
return []error{err}
|
|
}
|
|
//将一个空的[]error切片与ze.Errors()返回的错误切片合并在一起
|
|
//返回一个新切片
|
|
return append(([]error)(nil), ze.Errors()...)
|
|
}
|