void () { ThreadingAssertions.assertEventDispatchThread(); if (!mayRunActionsWhenAllCommitted()) return; List<Runnable> actions = new ArrayList<>(actionsWhenAllDocumentsAreCommitted.values()); beforeCommitHandler(); List<Pair<Runnable, Throwable>> exceptions = new ArrayList<>(); try { for (Runnable action : actions) { try (AccessToken ignored = ThreadContext.resetThreadContext()) { action.run(); } catch (ProcessCanceledException e) { // some actions are crazy enough to use PCE for their own control flow. // swallow and ignore to not disrupt completely unrelated control flow. } catch (Throwable e) { exceptions.add(Pair.create(action, e)); } } } finally { // unblock adding listeners actionsWhenAllDocumentsAreCommitted.clear(); } for (Pair<Runnable, Throwable> pair : exceptions) { Runnable action = pair.getFirst(); Throwable e = pair.getSecond(); LOG.error("During running " + action, e); } }