Исключение для вызываемого и будущего возврата

У меня есть следующий код.

Future<Integer> future = Executor.execute(callable);
            Integer i;
            try {
                i = future.get();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return MESSAGE_INT_CODE;
            } catch (ExecutionException e) {
                 // TODO Auto-generated catch block
                 //e.printStackTrace();
            }
            return i;

где ExecutionException может содержать другое исключение, например ABCException. и мой код вызова перехватывает ABCException, что является исключением времени выполнения, поэтому, если произойдет ExecutionException, как я узнаю, что это из-за ABCException? ExecutionException из-за какого-то исключения при запуске моего метода public call(). и метод вызова может иметь некоторые ABCException

мне так писать?

 catch (ExecutionException e) {
                     throw new ABCException(e.getMessage());
                     // TODO Auto-generated catch block
                     //e.printStackTrace();
                }

person Sanjay Rabari    schedule 22.05.2014    source источник
comment
Что вы имеете в виду, когда ExecutionException может быть какое-то другое исключение? Может быть каким-то другим исключением? Может ли содержать какое-то другое исключение? Ваш вопрос на данный момент очень неясен.   -  person Jon Skeet    schedule 22.05.2014
comment
@jon извините .. это опечатка ..executionException из-за некоторого исключения при запуске моего метода public call (). и метод вызова может иметь некоторое ABCException   -  person Sanjay Rabari    schedule 22.05.2014


Ответы (2)


попробуй e.getCause() instanceof ABCException

person Jens    schedule 22.05.2014

Если во время выполнения метода call() возникает исключение, ExecutorService перехватывает его и помещает в исключение ExecutionException. И когда вы вызываете future.get(); future выбрасывает ExecutionException, которое содержит исключение из вашего метода вызова. Итак, если я правильно вас понял, ваш код может выглядеть так:

try {
        future.get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        Throwable cause = e.getCause();
        if(cause instanceof ABCException) {
            // cast throwable to ABCException and rethrow it
            throw (ABCxception) cause;
        }else {
            // do something else
        }
    }
person Moses    schedule 22.05.2014