2010-07-30 121 views
13

在.net中,AggregateException類允許您引發包含多個異常的異常。什麼是來自.net的AggregateException的Java等價物?

例如,如果您並行運行多個任務,並且其中一些任務因異常而失敗,您將希望拋出一個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); 
} 
+0

,我不知道一個內置。但是,我從來沒有找過一個。 – Powerlord 2010-07-30 20:08:08

回答

3

我不知道任何內置或庫類,因爲我從來沒有想過要這樣做(通常你只是鏈接例外),但它不會很難寫下自己。

你可能想選擇一個例外是「主」,因此它可以用來填補蹤跡,等

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; 
    } 

} 
0

我真的不明白爲什麼你應該使用異常擺在首位,以紀念任務未完成/失敗,但在任何情況下,不該自己創造一個很難。得到任何代碼分享,以便我們可以幫助你更具體的答案?

+0

我不是用它來「標記」任何東西,我只是想表明至少有一次失敗。我編輯了主帖以包含代碼。 – 2010-07-30 20:16:24

+0

這個例子有用的一個例子是驗證。不是在第一個無效屬性上拋出異常,而是驗證整個類,以便消費者可以理解有效載荷無效的原因。這是發現API的更好方法。 – Brandon 2015-02-05 17:26:45

1

可以代表多個TASKA作爲

List<Callable<T>> tasks 

然後,如果你想在計算機實際上他們做並行使用

ExecutorService executorService = .. initialize executor Service 
List<Future<T>> results = executorService.invokeAll () ; 

現在你可以遍歷通過結果。

try 
{ 
    T val = result . get () ; 
} 
catch (InterruptedException cause) 
{ 
    // this is not the exception you are looking for 
} 
catch (ExecutionExeception cause) 
{ 
    Throwable realCause = cause . getCause () // this is the exception you are looking for 
} 

所以realCause(如果存在的話)就是在其相關任務中拋出的任何異常。

+0

很高興看到已有方法可以同時運行任務。但是,您的解決方案並不涉及拋出表示多個任務失敗的異常。 – 2010-07-31 18:08:29

相關問題