Where to catch Exceptions thrown from Callable.call()

38,792

AFAIR java.util.concurrent.Future.get() will throw ExecutionException if provided callable threw exception in the past (the exception is stored in the Future).

Exception thrown when attempting to retrieve the result of a task that aborted by throwing an exception. This exception can be inspected using the Throwable.getCause() method.

Share:
38,792

Related videos on Youtube

nano7
Author by

nano7

Updated on March 03, 2020

Comments

  • nano7
    nano7 about 4 years

    Possible Duplicate:
    Handling exceptions from Java ExecutorService tasks

    I use the ExecutorService from Java for coordinating Threads. For starting the threads I use

    pool = new ExecutorService(2);
    callableResults = pool.invokeAll(threads);
    

    To collect the result, I use future.get() for each thread. "threads" is a List of Objects from a Class which implements Callable and overrides call().

    Now Ive got the following problem. The method call() does throw various specific exceptions. invokeAll() and future.get() throw only InterruptedException.

    Where can I catch my specific exceptions which I throw in call()? Or do I have to handle them there? If one of those exceptions is thrown, is the result then a InterruptedException?

    • nano7
      nano7 about 12 years
      I read this before, but I did not see that he uses Callable and call() as well? Maybe Ive overseen it!? edit: correct. Ive overseen it. sorry.
    • Mikko Maunu
      Mikko Maunu about 12 years
    • Gray
      Gray about 12 years
      He uses Runnable but the exception catching is the same.
    • skaffman
      skaffman about 12 years
      Future.get() throws InterruptedException and ExecutionException. You need to read the javadocs more carefully.
    • Brian Roach
      Brian Roach about 12 years
    • nano7
      nano7 about 12 years
      Yes. Sorry. I only saw the InterruptedException.
  • Farid
    Farid about 3 years
    The very reason to use ExecutorService is its ability to run without blocking. get(), on the other hand, is blocking until the task is executed. Seems like this is one of the major drawbacks of ExecutorService