Sollevare e Sviluppare Nuove Eccezioni in C#

Nella scorsa lezione abbiamo introdotto il concetto di eccezione ed abbiamo visto come sia possibile intercettare gli errori con il blocco try … catch. Questa volta vedremo come sollevare un’eccezione, facciamo un esempio.

using System;
public class Corso
{
   static void Main(string[] args)
   {
       Corso c = new Corso();

       try
       {
           c.Test();
       }
       catch
       {
            Console.WriteLine("Ho intercettato la mia eccezione!");
       }

       Console.ReadKey();
  }

  public void Test()
  {
         throw new System.Exception();
  }
}

Come potete notare dall’esempio abbiamo sollevato un’eccezione con throw e poi l’abbiamo intercettata. Come abbiamo visto finora le eccezioni sono delle classi, vediamone i metodi e gli attributi comuni:

  • Message – crea un messaggio descrittivo associato all’eccezione
  • HelpLink – crea un collegamento ipertestuale ad una pagina d’aiuto
  • StackTrace – rappresenta lo stack di chiamata
  • Source – restituisce il nome dell’oggetto che ha generato l’errore
  • InnerException – ritorna l’istanza Exception che ha generato l’eccezione corrente

Come potete comprendere possiamo sviluppare nuove classi per gestire eccezioni personalizzate ed estendere così le informazioni sugli errori a tutte le anomalie della nostra applicazione. Vediamo quali sono le classi che gestiscono le eccezioni:

  • ArgumentException – uno o più argomenti passati ad un metodo non sono validi
  • ArithmeticException – segnala errori aritmetici di cast o conversioni
  • FormatException – generata quando il formato di un argomento non soddisfa le specifiche di parametro del metodo richiamato
  • IndexOutOfRangeException – sollevata quando si cerca di accedere ad una matrice utilizzando un indice al di fuori dei limiti della matrice stessa
  • InvalidCastException – conversione esplicita o cast non valido
  • InvalidOperationException – generata quando una chiamata ad un metodo non è valida per lo stato corrente dell’oggetto
  • IOException – sollevata quando si verifica un errore di I/O
  • NotImplementedException – generata quando un’operazione od un metodo richiesto non è implementato
  • NullReferenceException – generata quando viene effettuato un tentativo di annullare un riferimento ad un oggetto nullo
  • OutOfMemoryException – generata quando non c’è memoria suifficiente per continuare l’esecuzione del programma

Esiste un’altra classe per gestire le eccezioni della propria applicazione e dalla quale possiamo derivare le nostre eccezioni, si tratta di ApplicationException. Vediamo un esempio d’uso.

using System;

public class MyException : ApplicationException
{
    public MyException(string strMessage) : base(strMessage)
    {
    }
}

public class Corso
{
     static void Main(string[] args)
     {
           Corso c = new Corso();

           try
           {
                  c.Sbaglia();
           }
           catch (MyException e)
           {
                 Console.WriteLine("{0}", e.Message);
           }

           Console.ReadKey();
    }

    public void Sbaglia()
    {
          throw new MyException("Errore di prova!");
    }
}

In alcuni casi è conveniente propagare le eccezioni, ad esempio si potrebbe voler intercettare un errore, ripulire l’oggetto e poi sollevare un’eccezione al metodo chiamante. A
questo possiamo propagare la vecchia eccezione oppure instanziarne una nuova con l’operatore new. In questo caso  è possibile associare la nuova eccezione con quella vecchia utilizzando la proprietà InnerException, creando in questo modo una vera e propria catena che contiene la storia dell’errore ed i passaggi che sono stati elaborati.

<< Lezione Precedente – Inizio CorsoIndice LezioniLezione Successiva >>

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.