可调用和未来返回异常

时间:2014-05-22 07:13:28

标签: java exception concurrency future callable

我有以下代码。

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()。和call方法可能有一些ABCException

我应该这样写吗?

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

2 个答案:

答案 0 :(得分:2)

尝试e.getCause() instanceof ABCException

答案 1 :(得分:1)

如果在执行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
        }
    }