package interceptor import ( "context" "errors" "google.golang.org/grpc" "google.golang.org/grpc/grpclog" "google.golang.org/protobuf/types/known/emptypb" "runtime/debug" "sonet/pkg/utils/logger" ) func RecoverInterceptor(ctx context.Context, req any, server *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) { defer func() { if r := recover(); r != nil { switch r.(type) { case error: err = r.(error) case string: err = errors.New(r.(string)) default: err = errors.New("grpc server recover error") } grpclog.Error("grpc server error: ", r) debug.PrintStack() } }() resp, err = handler(ctx, req) if err == nil { if empty, ok := resp.(*emptypb.Empty); ok && empty == nil { resp = &emptypb.Empty{} // grpc: error while marshaling: proto: Marshal called with nil } else if resp == nil { logger.Warningf("grpc request: has no response: method=%s, %v", server.FullMethod, req) } } return }