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();
}