github.com/annwntech/go-micro/v2@v2.9.5/client/grpc/error.go (about) 1 package grpc 2 3 import ( 4 "github.com/annwntech/go-micro/v2/errors" 5 "google.golang.org/grpc/status" 6 ) 7 8 func microError(err error) error { 9 // no error 10 switch err { 11 case nil: 12 return nil 13 } 14 15 if verr, ok := err.(*errors.Error); ok { 16 return verr 17 } 18 19 // grpc error 20 s, ok := status.FromError(err) 21 if !ok { 22 return err 23 } 24 25 // return first error from details 26 if details := s.Details(); len(details) > 0 { 27 return microError(details[0].(error)) 28 } 29 30 // try to decode micro *errors.Error 31 if e := errors.Parse(s.Message()); e.Code > 0 { 32 return e // actually a micro error 33 } 34 35 // fallback 36 return errors.InternalServerError("go.micro.client", s.Message()) 37 }