mirror of
https://github.com/go-micro/go-micro.git
synced 2025-11-23 21:44:41 +02:00
Errors (#2290)
* 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:
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user