From de7b085cf7bed61637a55a4d4f7010de581ee244 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Sat, 9 Sep 2023 15:22:49 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20super=20?= =?UTF-8?q?=E5=8C=85=E4=B8=AD=E7=9A=84=20error=20=E9=83=A8=E5=88=86?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E8=AE=BE=E8=AE=A1=E4=B8=8D=E5=90=88?= =?UTF-8?q?=E7=90=86=E7=9A=84=E5=9C=B0=E6=96=B9=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=B3=A8=E5=86=8C=E9=94=99=E8=AF=AF=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E5=B9=B6=E5=8F=91=E8=AF=BB=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/super/error.go | 47 ++++++++++++++++++++++++++++++++------- utils/super/error_test.go | 13 +++++++++++ 2 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 utils/super/error_test.go diff --git a/utils/super/error.go b/utils/super/error.go index 226b84c..9d1b2b8 100644 --- a/utils/super/error.go +++ b/utils/super/error.go @@ -2,36 +2,67 @@ package super import ( "errors" + "sync" ) var errorMapper = make(map[error]int) var errorMapperRef = make(map[error]error) +var mutex sync.Mutex // RegError 通过错误码注册错误,返回错误的引用 func RegError(code int, message string) error { if code == 0 { - panic("error code can not be 0") + return errors.New("error code can not be 0") } - err := errors.New(message) + mutex.Lock() + defer mutex.Unlock() + err := &ser{code: code, message: message} errorMapper[err] = code return err } // RegErrorRef 通过错误码注册错误,返回错误的引用 +// - 引用将会被重定向到注册的错误信息 func RegErrorRef(code int, message string, ref error) error { if code == 0 { - panic("error code can not be 0") + return errors.New("error code can not be 0") } - err := errors.New(message) + mutex.Lock() + defer mutex.Unlock() + err := &ser{code: code, message: message} errorMapper[err] = code errorMapperRef[ref] = err return ref } -// GetErrorCode 通过错误引用获取错误码,如果错误不存在则返回 0 -func GetErrorCode(err error) (int, error) { - if ref, exist := errorMapperRef[err]; exist { +// GetError 通过错误引用获取错误码和真实错误信息,如果错误不存在则返回 0,如果错误引用不存在则返回原本的错误 +func GetError(err error) (int, error) { + unw := errors.Unwrap(err) + if unw == nil { + unw = err + } + mutex.Lock() + defer mutex.Unlock() + if ref, exist := errorMapperRef[unw]; exist { + //err = fmt.Errorf("%w : %s", ref, err.Error()) err = ref } - return errorMapper[err], err + unw = errors.Unwrap(err) + if unw == nil { + unw = err + } + code, exist := errorMapper[unw] + if !exist { + return 0, errors.New("error not found") + } + return code, err +} + +type ser struct { + code int + message string +} + +func (slf *ser) Error() string { + return slf.message } diff --git a/utils/super/error_test.go b/utils/super/error_test.go new file mode 100644 index 0000000..32b417f --- /dev/null +++ b/utils/super/error_test.go @@ -0,0 +1,13 @@ +package super_test + +import ( + "errors" + "github.com/kercylan98/minotaur/utils/super" + "testing" +) + +func TestGetError(t *testing.T) { + var ErrNotFound = errors.New("not found") + var _ = super.RegErrorRef(100, "test error", ErrNotFound) + t.Log(super.GetError(ErrNotFound)) +}