package org.limewire.concurrent; import java.util.concurrent.AbstractExecutorService; import java.util.concurrent.Callable; import java.util.concurrent.Future; import org.limewire.util.ExceptionUtils; /** An extension to AbstractExecutorService that catches unexpected exceptions and reports them. */ abstract class AbstractErrorCatchingExecutorService extends AbstractExecutorService { @Override public <T> Future<T> submit(final Callable<T> task) { return super.submit(new Callable<T>() { public T call() throws Exception { try { return task.call(); } catch(RuntimeException re) { ExceptionUtils.reportOrReturn(re); throw re; } catch(Error error) { ExceptionUtils.reportOrReturn(error); throw error; } }; }); } @Override public Future<?> submit(final Runnable task) { return super.submit(new Runnable() { public void run() { try { task.run(); } catch (Throwable t) { ExceptionUtils.reportOrReturn(t); ExceptionUtils.rethrow(t); } } }); } @Override public <T> Future<T> submit(final Runnable task, T result) { return super.submit(new Runnable() { @Override public void run() { try { task.run(); } catch (Throwable t) { ExceptionUtils.reportOrReturn(t); ExceptionUtils.rethrow(t); } } }, result); } }