public static void tryAll(List<Callable<Void>> all) throws Throwable {
        Throwable exception = null;
        for (Callable<Void> call : all) {
            try {
                call.call();
            } catch (Throwable t) {
                if (exception != null)
                    exception.addSuppressed(t);
                else
                    exception = t;
            }
        }
        if (exception != null)
            throw exception;
    }
@Test
    public void testTryAll() throws Throwable {
        Map<String, Object> recorded = new HashMap<>();

        Utils.tryAll(asList(
            recordingCallable(recorded, "valid-0", null),
            recordingCallable(recorded, null, new TestException("exception-1")),
            recordingCallable(recorded, "valid-2", null),
            recordingCallable(recorded, null, new TestException("exception-3"))
        ));
        Map<String, Object> expected = Utils.mkMap(
            mkEntry("valid-0", "valid-0"),
            mkEntry("exception-1", new TestException("exception-1")),
            mkEntry("valid-2", "valid-2"),
            mkEntry("exception-3", new TestException("exception-3"))
        );
        assertEquals(expected, recorded);

        recorded.clear();
        Utils.tryAll(asList(
            recordingCallable(recorded, "valid-0", null),
            recordingCallable(recorded, "valid-1", null)
        ));
        expected = Utils.mkMap(
            mkEntry("valid-0", "valid-0"),
            mkEntry("valid-1", "valid-1")
        );
        assertEquals(expected, recorded);

        recorded.clear();
        Utils.tryAll(asList(
            recordingCallable(recorded, null, new TestException("exception-0")),
            recordingCallable(recorded, null, new TestException("exception-1")))
        );
        expected = Utils.mkMap(
            mkEntry("exception-0", new TestException("exception-0")),
            mkEntry("exception-1", new TestException("exception-1"))
        );
        assertEquals(expected, recorded);
    }