package tc.oc.commons.core.concurrent;
import javax.annotation.Nullable;
import tc.oc.commons.core.exception.ExceptionHandler;
import tc.oc.commons.core.util.StackTrace;
import tc.oc.commons.core.util.ThrowingRunnable;
import tc.oc.commons.core.util.Traceable;
public class CatchingRunnable<T extends Throwable> implements Runnable, Traceable {
private final ExceptionHandler handler;
private final Runnable runnable;
private final @Nullable StackTrace trace;
public CatchingRunnable(ExceptionHandler<?> handler, Runnable runnable, @Nullable StackTrace trace) {
this.handler = handler;
this.runnable = runnable;
this.trace = trace;
}
public CatchingRunnable(ExceptionHandler<?> handler, ThrowingRunnable<? extends T> runnable, @Nullable StackTrace trace) {
this(handler, (Runnable) runnable, trace);
}
@Override
public @Nullable StackTrace stackTrace() {
return trace;
}
@Override
public void run() {
try {
if(runnable instanceof ThrowingRunnable) {
((ThrowingRunnable) runnable).runThrows();
} else {
runnable.run();
}
} catch(Throwable throwable) {
handler.handleException(throwable, runnable, trace);
}
}
}