Sollevare e Sviluppare Nuove Eccezioni in C#

La gestione delle eccezioni in linguaggio C#, come intercettarle e crearne di personalizzate, come sempre ho inserito del codice sorgente esplicativo per poter comprenderne in pratica il comportamento.

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 >>

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.