2012-05-03 12 views
18

Mi chiedo, c'è un modo per eseguire un blocco solo se non viene lanciata alcuna eccezione?Prova a catturare finalmente: fai qualcosa se non viene lanciata alcuna eccezione

Il meglio che posso venire in mente è questa:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
}finally{ 
    if(!exception){ 
     // i can do what i want here 
    } 
} 

C'è un modo migliore?

+0

Avete qualche "ritorno" nel blocco try? – Guillaume

+0

Le risposte hanno 18 voti tra loro e la domanda 1 voto? –

+0

@Guillaume non restituisce – lowerkey

risposta

33

Certo che c'è: metterlo nella parte inferiore del blocco try.

try{ 
    // something 
    // i can do what i want here 
}catch(Exception e){ 
    // handle exception 
} 

Questo non è del tutto equivalente al codice originale, nel senso che se "ciò che vuoi" getta, l'eccezione sarà catturato localmente (questo non sarebbe accaduto con il vostro schema originale). Questo è qualcosa che potresti o non potrebbe interessarti, e c'è una buona possibilità che anche il diverso comportamento sia corretto.

Se si desidera portare il vecchio comportamento di nuovo, è anche possibile utilizzare questa variante che non richiede un finally solo per il gusto di scrivere la condizione "se non si smentisce mai":

var checkpointReached = false; 
try{ 
    // something 
    checkpointReached = true; 
    // i can do what i want here 
}catch(Exception e){ 
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint 
    // handle exception 
} 
+0

+1, bella risposta. –

+0

Con il problema che se si ripete questo modello si ottiene l'imbriccatura try-catch. Quindi è consigliato solo se si prevedono poche eccezioni. –

+0

@dystroy: Non sei sicuro di cosa intendi, puoi elaborare? – Jon

3

È don Ho bisogno della clausola finale.

Una soluzione:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
} 
if(!exception){ 
    // u can do what u want here 
} 

solito sarà sufficiente avere un ritorno nella vostra clausola catch in modo che non hanno nemmeno bisogno di prova:

try{ 
    // something 
}catch(Exception e){ 
    // do things 
    return; 
} 
// u can do what u want here 

o (a seconda dell'uso caso e in genere meno chiaro, soprattutto se si prevedono più eccezioni - non si desidera avere imbricazioni try-catch ...):

try{ 
    // something 
    // u can do what u want here 
}catch(Exception e){ 
    // do things 
} 
1

No, quello che hai è probabilmente il modo migliore per farlo in C#.

Ciò presuppone che:

  • non si vuole il codice "Posso fare quello che voglio qui" per eseguire alla parte inferiore del vostro try blocco. (Forse perché non si vuole eccezioni in quel codice per essere gestite dal principale catch blocco.)
  • non si vuole il "Posso fare quello che voglio qui" codice per eseguire completamente al di fuori del try...catch...finally struttura. (Forse perché si vuole che l'esecuzione di codice prima che qualche altro codice che sta seduto all'interno del blocco finally.)
4

Puoi strutturare il codice che il doSomething è l'ultima istruzione nel blocco e non buttare?

bool exception = false; 
try{ 
    // something 
    doSomething(); 
} catch { 
} 
finally { 
} 
+0

@ Jeff Fosterno ha bisogno di bloccare finalmente qui. –

+1

Avevo pensato che esistesse un codice cleanup di tipo boilerplate che si voleva eseguire sempre. In caso contrario, hai sicuramente ragione, è ridondante. –

2

sì, c'è: metterlo alla fine del blocco try :)

1

Mentre non v'è nulla di sbagliato con il codice, è inutile.In poche parole il codice che si desidera eseguire sul fondo del blocco try:

try { 
    ... 
    // No errors to this point, run what you wanted to run in the finally. 
} 
catch(Exception e) { 
    ... 
} 
0

Credo che siete alla ricerca di una prova all'interno della vostra prova:

try{ 
    // something 

    try{ 
     // something else not interfering with first try 
    } catch(Exception innerEx){ 
     // something else threw this innerEx 
    } 

}catch(Exception outerEx){ 
    // something threw this outerEx 
} 

Anche se questo è generalmente considerata cattiva pratica, Mi piace più della versione flag.

Problemi correlati