package sys_error import ( "fmt" "strings" ) // 业务错误定义 type BusinessError struct { // 用户提示信息 UserMsg string // 错误信息传递(用于开发回溯定位,不给用户展示) Errors []string ErrorCode int } // 新建业务错误 // 如果errs为空,则返回一个只包含用户提示信息的业务错误 // 如果errs不为空,如果errs是一个业务错误,则附加错误信息,否则返回一个包含用户提示信息和错误信息的业务错误 func New(userMsg string, errs ...error) *BusinessError { if len(errs) == 1 { be, ok := errs[0].(*BusinessError) if ok { be.prependUserMsg(userMsg) return be } else { return &BusinessError{ UserMsg: userMsg, Errors: []string{errs[0].Error()}, } } } return &BusinessError{ UserMsg: userMsg, // Errors: convert(errs), } } func NewCode(userMsg string, errCode int, errs ...error) *BusinessError { if len(errs) == 1 { be, ok := errs[0].(*BusinessError) if ok { be.prependUserMsg(userMsg) return be } else { return &BusinessError{ UserMsg: userMsg, ErrorCode: errCode, Errors: []string{errs[0].Error()}, } } } return &BusinessError{ UserMsg: userMsg, ErrorCode: errCode, // Errors: convert(errs), } } func IsBusinessError(err error) bool { _, ok := err.(*BusinessError) return ok } func (e *BusinessError) prependUserMsg(userMsg string) { e.UserMsg = fmt.Sprintf("%s,%s", userMsg, e.UserMsg) } // func convert(err []error) []string { // s := []string{} // for _, e := range err { // s = append(s, e.Error()) // } // return s // } func (e *BusinessError) Append(err error) { e.Errors = append(e.Errors, err.Error()) } func (e *BusinessError) Error() string { return strings.Join(e.Errors, ", ") }