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 Corso – Indice Lezioni – Lezione Successiva >>