2011-08-26 5 views
12

Uno di questi è rischioso? Uno è meglio? O è una di quelle cose che stampi e lanci una freccia per decidere?Ritorno in try & catch contro return in infine?

io voglio fare questo, ora che ho capito come funziona finalmente:

try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close(); 
    return something; 
} 

ma ho visto:

try { 
    stuff that changes something... 
    return something; 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
    return something; 
} 
finally { 
    stuff.close(); 
} 
+1

@Dlev - Tranne il primo C non valido, quindi non può essere eseguito. Quindi, come può essere preferibile? Questa domanda dovrebbe essere chiesta di nuovo, quella in cui qualsiasi codice è in realtà un codice valido, altrimenti il ​​suo tipo di inutile. –

+0

@Ramhound Oops, intendevo dire che il primo non è C# legale. Quest'ultimo è effettivamente valido sintatticamente. – dlev

risposta

17

Non si può return da finally. Si otterrà errore di compilazione:

Control cannot leave the body of a finally clause


Se la classe di destinazione implementa IDisposable allora vorrei fare dopo:

using (stuff s = new stuff()) 
{ 
    return stuff; 
} 

o

using (stuff s = new stuff()) 
{ 
    try 
    { 
     // do stuff 
     return stuff; 
    } 
    catch (Exception ex) 
    { 
     // do logging or another stuff 
     return something; 
    } 
} 

chiamerà Dispose() per voi se quella volontà essere richiesto/possibile.

+0

Doh! Prova a compilare prima di chiedere la prossima volta, Self! È logico che il controllo non possa lasciare un finale, poiché finalmente è così unico nell'attirare l'attenzione. – ChuckNeuros

+2

@ user540903: Beh, sì, dovresti averlo compilato. Ma non picchiarti troppo male; ci sono lingue in cui il ritorno da ultimo è legale, e quelle lingue hanno una semantica del flusso di controllo piuttosto strana come risultato. È una domanda ragionevole in generale, non solo per C#. –

+0

@Eric Sono piuttosto Java è una di quelle lingue. Da quello che ricordo, il 'return' più recente sovrascrive quelli precedenti, quindi' prova {gira nuovo BlahException(); } catch {return 1; } finally {return 2; } 'restituisce effettivamente un' 2' al chiamante. – dlev

17

Personalmente avrei fatto né e userei


try { 
    stuff that changes something... 
} 
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
} 
finally { 
    stuff.close();  
} 
return something; 

anche nella dichiarazione finally, controllare che è necessario chiudere/smaltire oggetti come potrebbero mai sono stati aperti/set se hanno fallito.

vedi anche qui Is it bad practice to return from within a try catch finally block?

+1

Sono d'accordo con questo, come abatishchev dice che non si può tornare in un finale, non penso che si dovrebbe avere un ritorno in una presa. Se provi a pescare e non riesci a retrocedere, vuoi che ritorni in entrambi i modi e se riesci a rilanciare, non tornerà mai più. In entrambi i casi è sufficiente 1 dichiarazione di ritorno non 2 –

+1

di ritorno dall'interno del try/catch/finally non è considerato "programmazione strutturata". Sono d'accordo con Tim e Ben. –

0

Non v'è alcun rischio nel secondo approccio. Ma ti permette di restituire valori diversi in caso di eccezioni.

+1

Così restituisce una variabile e la imposta su valori diversi nei blocchi try e catch, ma ha solo 1 ritorno al di fuori dell'intero blocco try/catach. –

+0

restituendo il valore di una variabile può anche consentire di restituire valori diversi nel caso di eccezioni. –