[ARIES-1930] Consistent error handling
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java
index 3fc1b7b..9530d5e 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/AllOSGi.java
@@ -21,9 +21,7 @@
 import org.apache.aries.component.dsl.OSGiResult;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.ListIterator;
-import java.util.stream.Collectors;
 
 /**
  * @author Carlos Sierra Andrés
@@ -33,23 +31,35 @@
     @SafeVarargs
     public AllOSGi(OSGi<T>... programs) {
         super((bundleContext, op) -> {
-            ArrayList<OSGiResult> results = new ArrayList<>();
+            ArrayList<OSGiResult> results = new ArrayList<>(programs.length);
 
-            results.addAll(
-                Arrays.stream(programs).
-                    map(o -> o.run(bundleContext, op)).
-                    collect(Collectors.toList()));
+            try {
+                for (OSGi<T> program : programs) {
+                    results.add(program.run(bundleContext, op));
+                }
+            }
+            catch (Exception e) {
+                cleanUp(results);
+
+                throw e;
+            }
 
             return new OSGiResultImpl(
-                () -> {
-                    ListIterator<OSGiResult> iterator =
-                        results.listIterator(results.size());
-
-                    while (iterator.hasPrevious()) {
-                        iterator.previous().close();
-                    }
-                }
+                () -> cleanUp(results)
             );
         });
     }
+
+    private static void cleanUp(ArrayList<OSGiResult> results) {
+        ListIterator<OSGiResult> iterator =
+            results.listIterator(results.size());
+
+        while (iterator.hasPrevious()) {
+            try {
+                iterator.previous().close();
+            }
+            catch (Exception ex) {
+            }
+        }
+    }
 }
diff --git a/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java b/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java
index 31efd00..9634de2 100644
--- a/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java
+++ b/itests/src/main/java/org/apache/aries/component/dsl/test/DSLTest.java
@@ -1025,6 +1025,41 @@
     }
 
     @Test
+    public void testAllWithErrors() {
+        ArrayList<Integer> results = new ArrayList<>();
+
+        OSGi<Integer> program = OSGi.all(
+            just(1),
+            just(2),
+            just(3),
+            just(4),
+            just(5)
+        ).effects(
+            results::add, results::remove
+        );
+
+        try(OSGiResult result = program.run(bundleContext)) {
+            assertEquals(Arrays.asList(1, 2, 3, 4, 5), results);
+        }
+
+        try(OSGiResult result = program.filter(i -> {
+                if (i == 5) {
+                    throw new IllegalArgumentException();
+                }
+
+                return true;
+            }
+        ).run(
+            bundleContext)
+        ) {
+            fail();
+        }
+        catch (Exception e) {
+            assertEquals(Collections.emptyList(), results);
+        }
+    }
+
+    @Test
     public void testMultipleApplies() {
         ArrayList<Integer> results = new ArrayList<>();
         AtomicInteger results2 = new AtomicInteger();