1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-11-23 21:44:41 +02:00
* add errors.As

convert target err to *Error, return false if err don't match *Error

* update errors.As to (*Error, bool)

* fixing FromError panic issue when err is nil
This commit is contained in:
Johnson C
2021-09-30 14:45:10 +08:00
committed by GitHub
parent 4612baa7f8
commit 6dc25053ea
2 changed files with 40 additions and 1 deletions

View File

@@ -4,6 +4,7 @@ package errors
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"net/http" "net/http"
) )
@@ -138,9 +139,24 @@ func Equal(err1 error, err2 error) bool {
// FromError try to convert go error to *Error // FromError try to convert go error to *Error
func FromError(err error) *Error { func FromError(err error) *Error {
if err == nil {
return nil
}
if verr, ok := err.(*Error); ok && verr != nil { if verr, ok := err.(*Error); ok && verr != nil {
return verr return verr
} }
return Parse(err.Error()) return Parse(err.Error())
} }
// As finds the first error in err's chain that matches *Error
func As(err error) (*Error, bool) {
if err == nil {
return nil, false
}
var merr *Error
if errors.As(err, &merr) {
return merr, true
}
return nil, false
}

View File

@@ -17,7 +17,10 @@ func TestFromError(t *testing.T) {
if merr.Id != "go.micro.test" || merr.Code != 404 { if merr.Id != "go.micro.test" || merr.Code != 404 {
t.Fatalf("invalid conversation %v != %v", err, merr) t.Fatalf("invalid conversation %v != %v", err, merr)
} }
merr = FromError(nil)
if merr != nil {
t.Fatalf("%v should be nil", merr)
}
} }
func TestEqual(t *testing.T) { func TestEqual(t *testing.T) {
@@ -75,3 +78,23 @@ func TestErrors(t *testing.T) {
} }
} }
} }
func TestAs(t *testing.T) {
err := NotFound("go.micro.test", "%s", "example")
merr, match := As(err)
if !match {
t.Fatalf("%v should convert to *Error", err)
}
if merr.Id != "go.micro.test" || merr.Code != 404 || merr.Detail != "example" {
t.Fatalf("invalid conversation %v != %v", err, merr)
}
err = er.New(err.Error())
merr, match = As(err)
if match || merr != nil {
t.Fatalf("%v should not convert to *Error", err)
}
merr, match = As(nil)
if match || merr != nil {
t.Fatalf("nil should not convert to *Error")
}
}