2015-05-03 9 views

risposta

28

Qui ci sono due modi:

try { 
    // do something that may throw an exception 
    // do something else if an exception was not thrown 
} catch (...) { 
    ... 
} 

Oppure, se si desidera che il secondo blocco di codice per essere al di fuori del try blocco:

boolean success = false; 
try { 
    // do something that may throw an exception 
    success = true; 
} catch (...) { 
    ... 
} 
if (success) { 
    // do something if no exception was thrown 
} 

Si potrebbe anche mettere la dichiarazione if in un blocco finally, ma nella tua domanda non ci sono abbastanza informazioni per capire se sarebbe preferibile o meno.

15
try { 
    doSomething(); 
    doSomething2(); 
} catch (Exception e) { 
    doSomething3(); 
} 

In questo esempio, doSomething2() verrà eseguito solo se non viene generata un'eccezione da doSomething().

Se viene generata un'eccezione da doSomething(), doSomething2(); verranno saltati e l'esecuzione salta al doSomething3();

Si noti inoltre, verrà eseguito doSomething3() se c'è un eccezione generata da doSomething2();

Se viene generata un'eccezione , doSomething3(); non verrà eseguito.

+4

Ma cosa succede se 'doSomething2' lancia un'eccezione? Non voglio che venga catturato. – Santiago

+0

Quindi dovresti 'doSomething2()' per rimanere in questo ordine, ma se lancia un'eccezione non verrà catturato ed eseguirà 'doSomething3()'? Puoi mettere 'doSomething2()' in un blocco try catch del suo (blocco try annidato), e il tuo catch non potrebbe fare nulla come 'catch (Exception e) {}'. –

+0

Voglio inizializzare qualche valore finale su 'doSomething()', e se viene lanciata un'eccezione, voglio quindi che il valore finale mantenga un valore di fallback. Come si fa allora? –

2

Basta inserire il codice nel blocco try. Se viene generata un'eccezione, salterà al blocco catch. Se non viene lanciata alcuna eccezione, il codice verrà eseguito.

try { 
    someMethodThatMayThrowException(); 
    codeThatShouldBeRunIfNoExceptionThrown(); 
} catch (SomeException e) {} 
+1

Problema con questo diventa: Se 'SomeException' è molto generale - se potrebbe essere lanciato lungo la linea da' codeThatShouldBeRunIfNoExceptionThrown', o se quel metodo cambia per lanciare quell'eccezione in futuro - allora il blocco catch (silenziosamente) non sarà più gestire solo l'eccezione originale. – Noel

0

Eccezioni per il controllo del flusso è una specie di cattiva pratica. Se insisti, utilizza una variabile boolean.

boolean thrown = false; 

try { 
    //do something 
} catch (Exception e) { 
    thrown = true; 
} 

//do something only if nothing was thrown 

if (!thrown) { 
    // do stuff 
}