在.net中,AggregateException类允许您抛出包含多个异常的异常.
例如,如果并行运行多个任务,那么您将要抛出一个AggregateException,其中一些任务失败,例外.
java有相当的类吗?
具体情况我想用它在:
public static void runMultipleThenJoin(Runnable... jobs) { final List<Exception> errors = new Vector<Exception>(); try { //create exception-handling thread jobs for each job List<Thread> threads = new ArrayList<Thread>(); for (final Runnable job : jobs) threads.add(new Thread(new Runnable() {public void run() { try { job.run(); } catch (Exception ex) { errors.add(ex); } }})); //start all for (Thread t : threads) t.start(); //join all for (Thread t : threads) t.join(); } catch (InterruptedException ex) { //no way to recover from this situation throw new RuntimeException(ex); } if (errors.size() > 0) throw new AggregateException(errors); }
解决方法
我不知道任何内置或图书馆类,因为我从来没有想要这样做(通常你只是链接异常),但写自己并不难.
您可能希望选择其中一个例外作为“主要”,因此可用于填充堆栈跟踪等.
public class AggregateException extends Exception { private final Exception[] secondaryExceptions; public AggregateException(String message,Exception primary,Exception... others) { super(message,primary); this.secondaryExceptions = others == null ? new Exception[0] : others; } public Throwable[] getAllExceptions() { int start = 0; int size = secondaryExceptions.length; final Throwable primary = getCause(); if (primary != null) { start = 1; size++; } Throwable[] all = new Exception[size]; if (primary != null) { all[0] = primary; } Arrays.fill(all,start,all.length,secondaryExceptions); return all; } }