C# Exceptions
Quando viene eseguito un codice C#, possono essere restituiti innumerevoli errori: errori di programmazione, errori nell’inserimento dei dati di input, comportamenti imprevisti dei dispositivi connessi, ecc.
Quando il programma va in errore, il programma si blocca e genera un messaggio di errore. Tecnicamente si dice che C# genera un’eccezione
C# mette a disposizione una vera e propria “trappola” per intercettare gli errori e gestirli nel modo migliore, il costrutto Try-Catch-Finally
C# try e catch
L’istruzionetry
permette di definire un blocco di codice sottoposto a controllo degli errori durante l’esecuzione del programma
L’istruzione catch
permette di definire un blocco di codice che verrà eseguito nel caso si verificasse un errore nel blocco try.
Le istruzionitry
e catch
devono sempre essere presenti entrambe:
try
{
// codice che potrebbe generare un'eccezione di errore
}
catch (Exception e)
{
// blocco di codice per gestire l'errore
}
Non appena viene intercettato un errore nel blocco try il programma salta all’interno del blocco catch senza terminare le istruzioni non ancora eseguite nel blocco try.
Ad esempio:
try
{
// definisco un vettore di tipo int contenente 3 elementi
int[] numeri = {1, 2, 3};
// visualizzo il valore contenuto dell'elemento con indice 3
Console.WriteLine(numeri[3]);
}
catch (Exception e)
{
// l'errore viene generato perché il vettore contiene 3 elementi con indice rispettivamente 0, 1, 2
Console.WriteLine(e.Message);
}
Finally
L’istruzione finally
permette di eseguire un codice, dopo il blocco try...catch
, a prescindere dal fatto che venga o meno intercettato un errore.
Un utilizzo classico è la chiusura delle connessioni aperte all’interno del blocco try che, andando in errore, non verrebbero chiuse.
SqlConnection cnn = new SqlConnection("stringa di connessione");
SqlCommand cmd = new SqlCommand("Istruzione SQL", cnn);
try
{
// apertura della connessione al DB
cnn.Open();
cmd.ExecuteNonQuery();
// logiche di business
// ...
// ...
}
catch { }
finally
{
// chiusura della connessione se la connessione risulta ancora aperta
if (cnn.State == ConnectionState.Open)
cnn.Close();
}