From 34a01c627946349a120fa036956ba81b585c7587 Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Sun, 17 Oct 2021 10:59:33 +0200 Subject: [PATCH] Pass through try-compatible errors --- try/try.go | 11 +++++++++-- try/try_test.go | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/try/try.go b/try/try.go index a54c6e6..f24576b 100644 --- a/try/try.go +++ b/try/try.go @@ -47,7 +47,14 @@ type call struct { } // FromErr wraps a standard error into a try-compatible one with extended stack info. -func FromErr(err error) *tryErr { +func FromErr(err error) Err { + // If the error is already try-compatible, return + //nolint:errorlint + cterr, ok := err.(Err) + if ok { + return cterr + } + terr := &tryErr{err: err, callStack: []call{}} pc, _, _, ok := runtime.Caller(0) @@ -82,7 +89,7 @@ func FromErr(err error) *tryErr { } // NewErr creates a new try-compatible error with extended stack info. -func NewErr(msg string) *tryErr { +func NewErr(msg string) Err { return FromErr(errors.New(msg)) } diff --git a/try/try_test.go b/try/try_test.go index ad26fa7..fac96ee 100644 --- a/try/try_test.go +++ b/try/try_test.go @@ -220,6 +220,22 @@ func TestReturnStd(t *testing.T) { } } +func TestCheckTryErr(t *testing.T) { + testErr := NewErr("TestErr") + + tf := func() (err Err) { + defer Return(&err) + Check(testErr) + return + } + + err := tf() + + if err != testErr { + t.Fail() + } +} + func ExampleReturn() { var err Err defer Return(&err)