2010-07-30 8 views
13

In .net la classe AggregateException consente di generare un'eccezione contenente più eccezioni.Qual è l'equivalente java di AggregateException da .net?

Ad esempio, si vorrebbe lanciare un AggregateException se si eseguono più attività in parallelo e alcune di esse non sono riuscite con eccezioni.

java ha una classe equivalente?

Il caso specifico che voglio utilizzare in:

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

Io non sono a conoscenza di una. Tuttavia, non ne ho mai cercato neanche uno. – Powerlord

risposta

3

Non sono a conoscenza di classi incorporate o librerie, come non ho mai pensato di voler fare prima (in genere si limitano le eccezioni), ma non sarebbe così difficile scrivi te stesso

si sarebbe probabilmente desidera scegliere una delle eccezioni di essere "primario" in modo che possa essere utilizzato per riempire stacktraces, ecc

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

io non vedo proprio il motivo per cui si dovrebbe usare le eccezioni, in primo luogo per contrassegnare le attività come incompleta/fallito, ma in ogni caso, è shouldn essere difficile crearne uno da solo Hai qualche codice da condividere in modo che possiamo aiutarti con una risposta più specifica?

+0

Non lo sto usando per 'segnare' nulla, voglio solo indicare almeno un errore. Ho modificato il post principale per includere il codice. –

+0

Un esempio è utile per la convalida. Invece di lanciare un'eccezione sulla prima proprietà non valida, convalidare l'intera classe in modo che l'utente possa capire perché il payload non è valido. Questo è un modo molto più carino per scoprire un'API. – Brandon

1

È possibile rappresentare Taska multipla come

List<Callable<T>> tasks 

Poi, se si desidera che il computer per loro fare attualmente in uso in parallelo

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

Ora è possibile iterare attraverso i risultati.

Quindi realCause (se esiste) è l'eccezione che viene generata nell'attività associata.

+0

È bello vedere che esistono già modi per eseguire attività contemporaneamente. Tuttavia, la soluzione non risolve il lancio di un'eccezione che rappresenta più errori di attività. –

Problemi correlati