Incuriosito dal post di Michele che legittimamente si chiede per quale motivo è vietato usare return in un finally , sono andato in rete a caccia di un valido motivo. Assodato che l'uso di return in un blocco finally è perfettamente inutile, rimane da spiegare perchè sia anche vietato. Impossibile e inutile sono due cose ben diverse.

Mi sono alla fine imbattuto in un articoletto, dal quale ho tratto l'esempio che segue, che parla dell'uso di return nel finally in Java e ho scoperto che in tale linguaggio questa cosa è perfettamente legale, pur se sconsigliata. Purtroppo non ho il compilatore Java installato (ehm... i miei pc sono accuratamente decaffeinati), perciò non ho potuto verificare che l'esempio portato si comporti veramente c ome descritto, ma non ho nemmeno ragione di dubitarne.

Assumiamo quindi il seguente spezzone di codice:

public class Test
{
    public
void
run()
    {
        try
        {
            Console.WriteLine("run() about to throw exception...");
            // force an array out-of-bounds exception
            int
[] myInts = {1, 2};
            int
x = myInts[3];
        }
        finally
        {
             Console.WriteLine("run() in finally");
             return; // by returning within a finally we have lost previous exceptions
        }

        return
;
    }

    public static void Main(String[] args)
    {
        Test test = new
Test();

        try

        {
            test.run();
            Console.WriteLine("Main now after run() call");
        }
        catch
(Exception ex)
        {
            Console.WriteLine("Main got run() exception " + ex.Message);
        }
       
        Console.ReadLine();
    }
}

Immaginando di eseguire l'equivalente di questo codice in Java otterremo il risultato di perdere l'eccezione che viene generata nel metodo run(). Questo perchè,il blocco finally che viene eseguito subito prima di uscire dal metodo in seguito all'eccezione, ritornando il controllo alla Main() modifica il flusso di esecuzione.

In C# questo codice non compila, quindi, non perchè sia inelegante o inutile usare il return in un blocco finally, ma semplicemente perchè è foriero di comportamenti anomali e non facilmente interpretabili.

Quindi, vi invito ad un inchino con la mano sul cuore, per rigraziare ancora una volta i progettisti di C#.

Powered by