Stai ancora scorrendo verso il basso? Ecco qui!
Questa domanda mi ha fatto tornare indietro un po 'di tempo.
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
cosa verrebbe stampato nello scenario precedente? Sì, hai indovinato:
es. messaggio - qualunque cosa sia (probabilmente si è tentata una divisione per zero)
Infine blocca
Dopo finalmente
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
Cosa sarebbe questa stampa? Niente! Genera un errore poiché il blocco catch ha generato un errore.
In una buona struttura di programmazione, le tue eccezioni sarebbero incanalate, nel senso che questo codice verrà gestito da un altro livello. Per stimolare un caso del genere, cercherò di annidare questo codice.
try
{
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block")
}
console.writeline("After finally");
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
In questo caso l'output sarebbe:
- Infine blocca
- es. messaggio, qualunque esso sia.
È chiaro che quando si cattura un'eccezione e la si lancia di nuovo in altri livelli (Funneling), il codice dopo il lancio non viene eseguito. Agisce in modo simile a come funziona un ritorno all'interno di una funzione.
Ora sai perché non chiudere le tue risorse sui codici dopo il blocco catch, inserendole infine nel blocco.