From 6300e13455a17e008db0e66f69fdd9153bc5d218 Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 9 Aug 2021 15:30:13 +0800 Subject: [PATCH 1/7] feat(throw):#3 added ApplicationError --- throw.go | 43 +++++++++++++++++++++++++++++++++++++++++++ throw_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 throw.go create mode 100644 throw_test.go diff --git a/throw.go b/throw.go new file mode 100644 index 0000000..1b0f575 --- /dev/null +++ b/throw.go @@ -0,0 +1,43 @@ +package errors + +// ApplicationError an appliction error with predifined error variable and detail message +type ApplicationError struct { + // Inner inner error + Inner error + // Message detail message + Message string +} + +// Error implement error.Error +func (e *ApplicationError) Error() string { + if e == nil { + return "" + } + + if e.Inner != nil && e.Message != "" { + return e.Inner.Error() + ": " + e.Message + } else if e.Inner != nil { + return e.Inner.Error() + } else { + return e.Message + } + +} + +// Unwrap implement error.Unwrap +func (e *ApplicationError) Unwrap() error { + if e == nil { + return nil + } + return e.Inner +} + +// Throw create an application error with prefinded error variable and message +// example +// errors.Throw(ErrInvalidParameter, "bloober_id is missing") +func Throw(inner error, message string) error { + return &ApplicationError{ + Inner: inner, + Message: message, + } +} diff --git a/throw_test.go b/throw_test.go new file mode 100644 index 0000000..fa413dc --- /dev/null +++ b/throw_test.go @@ -0,0 +1,40 @@ +package errors + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestThrowIs(t *testing.T) { + + errIs := errors.New("Is") + + errIsNot := errors.New("Is not") + + err := Throw(errIs, "errors.Is works") + + require.ErrorIs(t, err, errIs) + require.Equal(t, false, errors.Is(err, errIsNot)) +} + +func TestThrowUnwrap(t *testing.T) { + + inner := errors.New("Inner") + + err := Throw(inner, "errors.Unwrap works") + + require.Equal(t, inner, errors.Unwrap(err)) +} + +func TestThrowAs(t *testing.T) { + + inner := errors.New("Inner") + + err := Throw(inner, "errors.Unwrap works") + + var appErr *ApplicationError + + require.Equal(t, true, errors.As(err, &appErr)) +} From d67fa0d31c74980909cb4e7b31cd9f55589bdecf Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 9 Aug 2021 17:05:52 +0800 Subject: [PATCH 2/7] feat(throw):#3 updated ApplicationError.Message with ApplicationError.MsgList --- throw.go | 16 +++++++++------- throw_test.go | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/throw.go b/throw.go index 1b0f575..f724014 100644 --- a/throw.go +++ b/throw.go @@ -1,11 +1,13 @@ package errors +import "strings" + // ApplicationError an appliction error with predifined error variable and detail message type ApplicationError struct { // Inner inner error Inner error - // Message detail message - Message string + // MsgList detail message + MsgList []string } // Error implement error.Error @@ -14,12 +16,12 @@ func (e *ApplicationError) Error() string { return "" } - if e.Inner != nil && e.Message != "" { - return e.Inner.Error() + ": " + e.Message + if e.Inner != nil && e.MsgList != nil { + return e.Inner.Error() + ": " + strings.Join(e.MsgList, ", ") } else if e.Inner != nil { return e.Inner.Error() } else { - return e.Message + return strings.Join(e.MsgList, ", ") } } @@ -35,9 +37,9 @@ func (e *ApplicationError) Unwrap() error { // Throw create an application error with prefinded error variable and message // example // errors.Throw(ErrInvalidParameter, "bloober_id is missing") -func Throw(inner error, message string) error { +func Throw(inner error, msgList ...string) error { return &ApplicationError{ Inner: inner, - Message: message, + MsgList: msgList, } } diff --git a/throw_test.go b/throw_test.go index fa413dc..be03aaa 100644 --- a/throw_test.go +++ b/throw_test.go @@ -13,7 +13,7 @@ func TestThrowIs(t *testing.T) { errIsNot := errors.New("Is not") - err := Throw(errIs, "errors.Is works") + err := Throw(errIs, "", "errors.Is works") require.ErrorIs(t, err, errIs) require.Equal(t, false, errors.Is(err, errIsNot)) From 316fe09fdd8f6c5de43ec78a00ad89718a4f8a91 Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 9 Aug 2021 17:24:56 +0800 Subject: [PATCH 3/7] feat(throw):#3 updated README.md --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index f4ec38e..1950731 100644 --- a/README.md +++ b/README.md @@ -105,5 +105,32 @@ fmt.Println(cause) => password mismatch ``` +## Throw Working with go standard Errors + +How to raise an `ApplicationError` with predefined error variables? + +``` +var ErrInvalidFormat = errors.New("[conf]invalid format") + +func ReadConfig() (*Config,error) { + //... + return nil, errors.Throw(ErrInvalidFormat, cfgFile) + +} + +func main() { + +cfg, err := ReadConfig() + +if errors.Is(err, ErrInvalidFormat) { + panic(err) +} + +} + +``` + +See [Unit Tests](throw_test.go) for more examples. + From 2ed5f44f46c72d35bd4614bc9529a6c452027eb4 Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 9 Aug 2021 17:26:58 +0800 Subject: [PATCH 4/7] feat(throw):#3 updated README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1950731..07e4e1c 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ fmt.Println(cause) => password mismatch ``` -## Throw Working with go standard Errors +## Working with [Errors](https://blog.golang.org/go1.13-errors) package How to raise an `ApplicationError` with predefined error variables? @@ -114,7 +114,7 @@ var ErrInvalidFormat = errors.New("[conf]invalid format") func ReadConfig() (*Config,error) { //... - return nil, errors.Throw(ErrInvalidFormat, cfgFile) + return nil, Throw(ErrInvalidFormat, cfgFile) } From 30e08fdfeab84cbb20c59f51084a840f0aaac177 Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 9 Aug 2021 17:27:57 +0800 Subject: [PATCH 5/7] feat(throw):#3 fixed typo --- throw_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/throw_test.go b/throw_test.go index be03aaa..0da1d2c 100644 --- a/throw_test.go +++ b/throw_test.go @@ -32,7 +32,7 @@ func TestThrowAs(t *testing.T) { inner := errors.New("Inner") - err := Throw(inner, "errors.Unwrap works") + err := Throw(inner, "errors.As works") var appErr *ApplicationError From 60e77358b8ebd921035176ad65b740aaba8022bd Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 9 Aug 2021 20:11:48 +0800 Subject: [PATCH 6/7] feat(throw):#3 fixed Unwrap --- throw.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/throw.go b/throw.go index f724014..f275c80 100644 --- a/throw.go +++ b/throw.go @@ -31,7 +31,12 @@ func (e *ApplicationError) Unwrap() error { if e == nil { return nil } - return e.Inner + + if e.Inner != nil { + return e.Inner + } + + return e } // Throw create an application error with prefinded error variable and message From abce18cd9999e11ad5cc7c52adbe1876b0dfde44 Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 9 Aug 2021 21:29:02 +0800 Subject: [PATCH 7/7] feat(throw):#3 updated error message format --- throw.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/throw.go b/throw.go index f275c80..5682671 100644 --- a/throw.go +++ b/throw.go @@ -17,11 +17,11 @@ func (e *ApplicationError) Error() string { } if e.Inner != nil && e.MsgList != nil { - return e.Inner.Error() + ": " + strings.Join(e.MsgList, ", ") + return e.Inner.Error() + ": " + strings.Join(e.MsgList, " ") } else if e.Inner != nil { return e.Inner.Error() } else { - return strings.Join(e.MsgList, ", ") + return strings.Join(e.MsgList, " ") } }