Skip to Main Content

How to do I propagate an exception from a Java 8 future eventhandler?

3192389Apr 25 2016 — edited Apr 25 2016

Hello,

How do I propagate an exception to the top level object for a non-blocking executor?

In short, I would like to catch the exception thrown in the wait object:

   public static void main(String[] args) {
                   
        Wait wait = new Wait(5000); //5 seconds

        try
        {
            wait.StartWait(); //return immediately
            Thread.sleep(10000); //10 seconds
            wait.StopWait();
        }
        catch (Exception e)
        {
            System.out.print("Timer timed out.");
        }

        System.out.print("Success!");       
    }

I am using a non-blocking future implementation located at: http://www.javacirecep.com/concurrency/java-implement-java-non-blocking-futures/

public void StartWait() throws ExecutionException, InterruptedException, TimeoutException, Exception {
executor = new NonBlockingExecutor(Executors.newSingleThreadExecutor());

NonBlockingFuture<Integer> future = executor.submitNonBlocking(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(iTimeout);
throw new TimeoutException("Timer Elapsed.");
}
});

future.setHandler(new FutureHandler<Integer>() {
@Override
public void onSuccess(Integer value) {
System.out.println("Task completed successfully.");
}

@Override
public void onFailure(Throwable e) throws Exception {
System.out.println(e.getMessage());
StopWait();
throw new Exception(e.getMessage()); //not caught in main!
}
});
}

I have a project that can be downloaded at: https://www.dropbox.com/s/54df16w19pn910l/non-blocking%20exception.zip?dl=0

Why isn't the onFailure exception caught in main?

Does the future variable need to be class-level?

Thank you.

williamj

Comments
Post Details
Added on Apr 25 2016
0 comments
494 views