From 49d73faa5fd2d269afface92269192ee50811ee6 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Wed, 20 Nov 2019 13:28:30 +0300 Subject: [PATCH] return error to caller on grpc server request processing (#962) Signed-off-by: Vasiliy Tolstov --- server/grpc/grpc.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/grpc/grpc.go b/server/grpc/grpc.go index ef613084..a09dd594 100644 --- a/server/grpc/grpc.go +++ b/server/grpc/grpc.go @@ -339,20 +339,26 @@ func (g *grpcServer) processRequest(stream grpc.ServerStream, service *service, // define the handler func fn := func(ctx context.Context, req server.Request, rsp interface{}) error { + ch := make(chan error, 1) + defer close(ch) + defer func() { if r := recover(); r != nil { log.Log("panic recovered: ", r) log.Logf(string(debug.Stack())) + ch <- errors.InternalServerError("go.micro.server", "panic recovered: %v", r) } }() returnValues = function.Call([]reflect.Value{service.rcvr, mtype.prepareContext(ctx), reflect.ValueOf(argv.Interface()), reflect.ValueOf(rsp)}) // The return value for the method is an error. if err := returnValues[0].Interface(); err != nil { - return err.(error) + ch <- err.(error) } - return nil + ch <- nil + + return <-ch } // wrap the handler func