1
This commit is contained in:
49
library/liberr/err.go
Normal file
49
library/liberr/err.go
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* @desc:错误处理
|
||||
* @company:云南奇讯科技有限公司
|
||||
* @Author: yixiaohu
|
||||
* @Date: 2022/3/2 14:53
|
||||
*/
|
||||
|
||||
package liberr
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/gogf/gf/v2/errors/gcode"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/tiger1103/gfast/v3/internal/consts"
|
||||
)
|
||||
|
||||
func ErrIsNil(ctx context.Context, err error, msg ...string) {
|
||||
if !g.IsNil(err) {
|
||||
if len(msg) > 0 {
|
||||
g.Log().Error(ctx, err.Error())
|
||||
panic(NewCode(consts.CodeError, msg[0]))
|
||||
} else {
|
||||
panic(NewCode(consts.CodeError, err.Error()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func ValueIsNil(value interface{}, msg string) {
|
||||
if g.IsNil(value) {
|
||||
panic(msg)
|
||||
}
|
||||
}
|
||||
|
||||
func NewCode(code int, msg string) error {
|
||||
return gerror.NewCode(gcode.New(code, msg, nil))
|
||||
}
|
||||
|
||||
func ErrIsNilCode(ctx context.Context, err error, code int, msg ...string) {
|
||||
if !g.IsNil(err) {
|
||||
if len(msg) > 0 {
|
||||
g.Log().Error(ctx, err.Error())
|
||||
panic(NewCode(code, msg[0]))
|
||||
} else {
|
||||
panic(NewCode(code, err.Error()))
|
||||
}
|
||||
}
|
||||
}
|
||||
164
library/liberr/err_test.go
Normal file
164
library/liberr/err_test.go
Normal file
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
* @desc:错误处理测试
|
||||
* @company:云南奇讯科技有限公司
|
||||
* @Author: yixiaohu
|
||||
* @Date: 2022/3/2 14:53
|
||||
*/
|
||||
|
||||
package liberr
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/gogf/gf/v2/errors/gcode"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
)
|
||||
|
||||
func TestErrIsNil(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
// Test case 1: 验证传入 nil 错误时不会 panic
|
||||
t.Run("nil error", func(t *testing.T) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
t.Errorf("ErrIsNil should not panic with nil error, but got: %v", r)
|
||||
}
|
||||
}()
|
||||
ErrIsNil(ctx, nil)
|
||||
})
|
||||
|
||||
// Test case 2: 验证传入非 nil 错误且无自定义消息时会 panic 并抛出原始错误
|
||||
t.Run("non-nil error without message", func(t *testing.T) {
|
||||
testErr := errors.New("test error")
|
||||
defer func() {
|
||||
if r := recover(); r == nil {
|
||||
t.Error("ErrIsNil should panic with non-nil error")
|
||||
} else if r != testErr {
|
||||
t.Errorf("Expected panic with error %v, but got: %v", testErr, r)
|
||||
}
|
||||
}()
|
||||
ErrIsNil(ctx, testErr)
|
||||
})
|
||||
|
||||
// Test case 3: 验证传入非 nil 错误和自定义消息时会 panic 并抛出自定义消息
|
||||
t.Run("non-nil error with custom message", func(t *testing.T) {
|
||||
testErr := errors.New("test error")
|
||||
customMsg := "custom error message"
|
||||
defer func() {
|
||||
if r := recover(); r == nil {
|
||||
t.Error("ErrIsNil should panic with non-nil error and custom message")
|
||||
} else if r != customMsg {
|
||||
t.Errorf("Expected panic with message %q, but got: %v", customMsg, r)
|
||||
}
|
||||
}()
|
||||
ErrIsNil(ctx, testErr, customMsg)
|
||||
})
|
||||
|
||||
// Test case 4: 验证传入多个消息时使用第一个消息
|
||||
t.Run("non-nil error with multiple messages", func(t *testing.T) {
|
||||
testErr := errors.New("test error")
|
||||
firstMsg := "first message"
|
||||
secondMsg := "second message"
|
||||
defer func() {
|
||||
if r := recover(); r == nil {
|
||||
t.Error("ErrIsNil should panic with non-nil error and messages")
|
||||
} else if r != firstMsg {
|
||||
t.Errorf("Expected panic with first message %q, but got: %v", firstMsg, r)
|
||||
}
|
||||
}()
|
||||
ErrIsNil(ctx, testErr, firstMsg, secondMsg)
|
||||
})
|
||||
|
||||
// Test case 5: 验证 gf 框架的 gerror.NewCode 错误处理 - 验证码场景
|
||||
t.Run("gerror with CodeValidationFailed", func(t *testing.T) {
|
||||
testErr := gerror.NewCode(gcode.CodeValidationFailed, "验证码已过期或不存在")
|
||||
defer func() {
|
||||
if r := recover(); r == nil {
|
||||
t.Error("ErrIsNil should panic with gerror")
|
||||
} else if r != testErr {
|
||||
t.Errorf("Expected panic with gerror %v, but got: %v", testErr, r)
|
||||
}
|
||||
}()
|
||||
ErrIsNil(ctx, testErr)
|
||||
})
|
||||
|
||||
// Test case 6: 验证 gerror.NewCode 错误与自定义消息
|
||||
t.Run("gerror with custom message", func(t *testing.T) {
|
||||
testErr := gerror.NewCode(gcode.CodeValidationFailed, "验证码已过期或不存在")
|
||||
customMsg := "验证失败"
|
||||
defer func() {
|
||||
if r := recover(); r == nil {
|
||||
t.Error("ErrIsNil should panic with gerror and custom message")
|
||||
} else if r != customMsg {
|
||||
t.Errorf("Expected panic with message %q, but got: %v", customMsg, r)
|
||||
}
|
||||
}()
|
||||
ErrIsNil(ctx, testErr, customMsg)
|
||||
})
|
||||
|
||||
// Test case 7: 验证不同类型的 gcode 错误
|
||||
t.Run("gerror with CodeInternalError", func(t *testing.T) {
|
||||
testErr := gerror.NewCode(gcode.CodeInternalError, "内部服务错误")
|
||||
defer func() {
|
||||
if r := recover(); r == nil {
|
||||
t.Error("ErrIsNil should panic with CodeInternalError")
|
||||
} else if r != testErr {
|
||||
t.Errorf("Expected panic with gerror %v, but got: %v", testErr, r)
|
||||
}
|
||||
}()
|
||||
ErrIsNil(ctx, testErr)
|
||||
})
|
||||
|
||||
// Test case 8: 验证多种验证失败场景
|
||||
t.Run("multiple validation scenarios", func(t *testing.T) {
|
||||
scenarios := []struct {
|
||||
name string
|
||||
err error
|
||||
msg string
|
||||
}{
|
||||
{
|
||||
name: "验证码过期",
|
||||
err: gerror.NewCode(gcode.CodeValidationFailed, "验证码已过期或不存在"),
|
||||
msg: "验证码验证失败",
|
||||
},
|
||||
{
|
||||
name: "参数验证失败",
|
||||
err: gerror.NewCode(gcode.CodeValidationFailed, "参数格式不正确"),
|
||||
msg: "请求参数错误",
|
||||
},
|
||||
{
|
||||
name: "业务验证失败",
|
||||
err: gerror.NewCode(gcode.CodeValidationFailed, "用户状态异常"),
|
||||
msg: "",
|
||||
},
|
||||
}
|
||||
|
||||
for _, scenario := range scenarios {
|
||||
t.Run(scenario.name, func(t *testing.T) {
|
||||
defer func() {
|
||||
if r := recover(); r == nil {
|
||||
t.Error("ErrIsNil should panic")
|
||||
} else {
|
||||
if scenario.msg != "" {
|
||||
if r != scenario.msg {
|
||||
t.Errorf("Expected panic with message %q, but got: %v", scenario.msg, r)
|
||||
}
|
||||
} else {
|
||||
if r != scenario.err {
|
||||
t.Errorf("Expected panic with error %v, but got: %v", scenario.err, r)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
if scenario.msg != "" {
|
||||
ErrIsNil(ctx, scenario.err, scenario.msg)
|
||||
} else {
|
||||
ErrIsNil(ctx, scenario.err)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user