Domanda

Quindi stamattina mi sono imbattuto in un codice che assomigliava a questo:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

Ora questo codice si compila bene e funziona come dovrebbe, ma non sembra giusto tornare dall'interno di un blocco try, specialmente se finalmente è associato.

Il mio problema principale è cosa succede se finalmente viene generata un'eccezione? Hai una variabile restituita ma anche un'eccezione da affrontare ... quindi sono interessato a sapere cosa pensano gli altri del ritorno da un blocco try?

È stato utile?

Soluzione

No, non è una cattiva pratica. Mettere return dove ha senso migliora la leggibilità e la manutenibilità e rende il tuo codice più semplice da capire. Non dovresti preoccuparti perché il blocco infine verrà eseguito se viene rilevata un'istruzione return .

Altri suggerimenti

L'ultimo verrà eseguito indipendentemente da cosa, quindi non importa.

Personalmente, eviterei questo tipo di codifica poiché non mi va di vedere le dichiarazioni di ritorno prima delle dichiarazioni finalmente.

La mia mente è semplice ed elabora le cose in modo piuttosto lineare. Pertanto, quando passo attraverso il codice per il funzionamento a secco, avrò la tendenza a pensare che una volta che posso raggiungere la dichiarazione di ritorno, tutto ciò che segue non importa che ovviamente è piuttosto sbagliato in questo caso (non che influenzerebbe la dichiarazione di ritorno ma quali potrebbero essere gli effetti collaterali).

Quindi, vorrei organizzare il codice in modo che l'istruzione return appaia sempre dopo le istruzioni finally.

Questo potrebbe rispondere alla tua domanda

Cosa succede veramente in un provare {return x; } infine {x = null; } dichiarazione?

Dalla lettura di questa domanda sembra che tu possa avere un altro tentativo di catturare la struttura nell'istruzione finally se pensi che potrebbe generare un'eccezione. Il compilatore capirà quando restituire il valore.

Detto questo, potrebbe essere meglio ristrutturare il tuo codice comunque solo per non confonderti in seguito o per qualcun altro che potrebbe non essere a conoscenza di questo.

Funzionalmente non c'è differenza.

Tuttavia c'è un motivo per non farlo. Metodi più lunghi con diversi punti di uscita sono spesso più difficili da leggere e analizzare. Ma questa obiezione ha più a che fare con le dichiarazioni di rimpatrio che con le catture e infine i blocchi.

Nel tuo esempio in entrambi i casi è equivalente, non sarei nemmeno sorpreso se il compilatore generasse lo stesso codice. Se si verifica un'eccezione nel blocco finally, si verificano gli stessi problemi se si inserisce l'istruzione return in blocco o al di fuori di essa.

La vera domanda è stilisticamente qual è la migliore. Mi piace scrivere i miei metodi in modo che ci sia una sola dichiarazione di ritorno, in questo modo è più facile vedere il flusso fuori dal metodo, ne consegue che mi piace anche mettere l'ultima dichiarazione di ritorno, quindi è facile vedere che è la fine del metodo e questo è ciò che restituisce.

Penso che con la dichiarazione di ritorno così ben posizionata come l'ultima dichiarazione, è meno probabile che altre vengano e spargano più dichiarazioni di reso in altre parti del metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top