2012-05-02 30 views
7

Ho un requisito in cui nel flusso di esecuzione del programma dovrebbe continuare anche dopo il lancio di un'eccezione.Come continuare l'esecuzione del programma anche dopo aver lanciato un'eccezione?

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { 
    } 
} 

Se l'eccezione viene generata nella prima iterazione, l'esecuzione del flusso viene interrotta. Il mio requisito è anche dopo aver lanciato un'eccezione per la prima iterazione, altre iterazioni dovrebbero continuare. Posso scrivere la logica nel blocco catch?

+2

La logica che hai ora fa esattamente questo. Se l'eccezione mette 'DataSource' in uno stato non valido, il prossimo tentativo di usare l'iteratore può generare un'eccezione diversa. –

risposta

-3

No, non esiste un supporto per la lingua per la gestione di un'eccezione e quindi per tornare all'istruzione che l'ha provocata. È necessario racchiudere separati costrutti try...catch in corrispondenza di ogni sottosequenza di operazioni che dovrebbero essere eseguite anche se la sottosequenza precedente ha generato un'eccezione.

+1

* "No, non esiste un supporto per la lingua per gestire un'eccezione e quindi tornare indietro alla dichiarazione che lo ha causato." * Questo non è ciò che è stato chiesto. Quello che è stato chiesto è come consentire a *** altre iterazioni di continuare. –

+0

^Vero. Penso che ciò che vorrebbe fosse qualcosa di simile: aggiungi un 'finally' dopo il' catch' e continua l'iterazione da dove l'iterazione si è arrestata. Anche se questo potrebbe essere una soluzione, non è consigliabile e piuttosto brutto da fare. –

6

Se non si interrompe il ciclo in qualche modo all'interno del blocco catch, le altre iterazioni continueranno, indipendentemente dal fatto che sia stata generata un'eccezione in una precedente iterazione.

Prova questo semplice esempio e vediamo cosa succede:

List<String> list = new ArrayList<String>(); 
list.add("1"); 
list.add("2"); 
list.add("3"); 

for(String str: list) { 
    try { 
     System.out.println(str); 
     throw new Exception("Exception for string " + str); 
    } catch(Exception ex) { 
     System.out.println("Caught exception"); 
    } 
} 

Vedrete che tutte le iterazioni eseguire, anche se ciascuno di essi genera un'eccezione.

+0

Ciao Tudor, grazie per la tua risposta. capito. Ho anche bisogno di mettere finalmente il tipo di blocco che verrà chiamato dopo tutte le iterazioni. non dovrebbe essere chiamato per ogni iterazione. come posso ottenerlo? Mi aiuti per favore! – user1016403

+0

@ user1016403: In tal caso dovrai avvolgere l'intero ciclo for in un blocco try ... finally' come: 'try {for (...) {code}} finally {}' – Tudor

0

La logica che hai ora fa esattamente questo. Se l'eccezione mette lo stato DataSource in uno stato non valido, il prossimo tentativo di utilizzare l'iteratore può generare un'eccezione diversa, ma è diverso e specifico per DataSource (quindi dovresti controllare se lo DataSource ti permette di fare qualcosa da fare con quell'altro stato non valido in qualche modo). Ma nel caso generale, lo stai facendo bene.

9

Ben prima di tutto,

Ci sono 2 tipi di eccezioni. Controllato & Deselezionato.

Le eccezioni non selezionate sono quelle da cui il programma non è in grado di eseguire il ripristino. Come NullPointers, dicendoti che qualcosa è veramente sbagliato nella tua logica.

Le eccezioni controllate sono eccezioni di runtime e da quelle da cui è possibile eseguire il ripristino.

Pertanto, è consigliabile evitare l'uso degli indicatori di cattura che cercano la classe di base "Eccezione". Che rappresentano entrambe le volte Probabilmente dovresti considerare di cercare eccezioni specifiche (normalmente sottoclassi di eccezioni run-time).

In breve, c'è molto di più in questo.

Si dovrebbe anche tenere presente che non si dovrebbe usare la gestione delle eccezioni come flusso di lavoro. di solito indica che la tua architettura è in qualche modo carente. E come afferma il nome, dovrebbero essere trattati come "eccezioni" per un'esecuzione normale.

Ora, considerando che si codice:

for(DataSource source : dataSources) { 
    try { 
     //do something with 'source' 
    } catch (Exception e) { // catch any exception 
     continue; // will just skip this iteration and jump to the next 
    } 
    //other stuff ? 
} 

Come lo è, dovrebbe catturare l'eccezione e andare avanti. Forse c'è qualcosa che non ci stai dicendo? : P

In ogni caso, spero che questo aiuti.

1

Se si verifica un'eccezione sulla for(DataSource source : dataSources) durante la chiamata dataSources per inizializzare l'iteratore, poi che eccezione sarà non essere catturato.

È ciò che intendi per "Se l'eccezione viene generata nella prima iterazione, l'esecuzione del flusso viene interrotta."?

Se questo è il caso, non c'è nient'altro che si possa fare e il ciclo dovrebbe non eseguire eventuali interazioni.

Problemi correlati