Esaminare eccezioni generate dal compilatore
- 10 minuti
Le eccezioni vengono generate dal runtime .NET o dal codice in un programma. Il tipo di eccezione dipende dal codice che causa l'eccezione.
Eccezioni generate dal compilatore
Il runtime .NET genera eccezioni quando le operazioni di base hanno esito negativo. Ecco un breve elenco di eccezioni di runtime e le relative condizioni di errore:
ArrayTypeMismatchException: generata quando una matrice non può archiviare un determinato elemento perché il tipo effettivo dell'elemento non è compatibile con il tipo effettivo della matrice.DivideByZeroException: generata quando viene effettuato un tentativo di dividere un valore integrale per zero.FormatException: Lanciata quando il formato di un argomento non è valido.IndexOutOfRangeException: generata quando viene effettuato un tentativo di indicizzazione di una matrice quando l'indice è minore di zero o al di fuori dei limiti della matrice.InvalidCastException: generata quando una conversione esplicita da un tipo di base a un'interfaccia o a un tipo derivato ha esito negativo in fase di esecuzione.NullReferenceException: generata quando viene effettuato un tentativo di fare riferimento a un oggetto il cui valore è Null.OverflowException: generata quando si verifica un overflow di un'operazione aritmetica in un contesto.
Esempi di codice per le eccezioni generate dal compilatore
Gli esempi di codice seguenti illustrano un esempio di codice che causa un'eccezione generata dal compilatore.
ArrayTypeMismatchException
Viene generata un'eccezione di tipo ArrayTypeMismatchException quando viene effettuato un tentativo di archiviare un elemento del tipo errato all'interno di una matrice. Nell'esempio seguente viene generata un'eccezione ArrayTypeMismatchException quando si tenta di archiviare un valore numerico in una matrice di stringhe.
string[] names = { "Dog", "Cat", "Fish" };
Object[] objs = (Object[])names;
Object obj = (Object)13;
objs[2] = obj; // ArrayTypeMismatchException occurs
DivideByZeroException
Un'eccezione di tipo DivideByZeroException si verifica quando si tenta di dividere un numero intero o decimale per zero. Nell'esempio seguente viene generata un'eccezione durante l'esecuzione di una divisione intera DivideByZeroException.
int number1 = 3000;
int number2 = 0;
Console.WriteLine(number1 / number2); // DivideByZeroException occurs
Annotazioni
La divisione di un valore a virgola mobile per zero non genera un'eccezione; si traduce in infinito positivo, infinito negativo o non un numero (NaN), secondo le regole dell'aritmetica IEEE 754.
FormatException
Un'eccezione di tipo FormatException si verifica quando il formato di un argomento non è valido o quando una stringa di formato composito non è corretta. Nell'esempio seguente viene generata un'eccezione FormatException quando si tenta di convertire una stringa in un numero intero.
int valueEntered;
string userValue = "two";
valueEntered = int.Parse(userValue); // FormatException occurs
IndexOutOfRangeException
Un'eccezione di tipo IndexOutOfRangeException viene generata quando viene effettuato un tentativo di accesso a un elemento di una matrice o di una raccolta con un indice esterno ai limiti. Nell'esempio seguente viene generata un'eccezione IndexOutOfRangeException quando si tenta di assegnare l'ultimo elemento della values1 matrice all'ultimo elemento della values2 matrice.
int[] values1 = { 3, 6, 9, 12, 15, 18, 21 };
int[] values2 = new int[6];
values2[values1.Length - 1] = values1[values1.Length - 1]; // IndexOutOfRangeException occurs
InvalidCastException
Quando si tenta di eseguire un cast non valido o una conversione esplicita, viene generata un'eccezione di tipo InvalidCastException . Nell'esempio seguente viene generata un'eccezione InvalidCastException quando si prova a eseguire il cast di un elemento object di tipo stringa in una variabile int.
object obj = "This is a string";
int num = (int)obj;
NullReferenceException
Viene generata un'eccezione di tipo NullReferenceException quando si tenta di accedere a un membro in un tipo il cui valore è Null. Vengono visualizzati due esempi. Nel primo esempio viene generata un'eccezione NullReferenceException quando si tenta di accedere a un elemento di una matrice Null. Il secondo esempio genera un'eccezione NullReferenceException quando si tenta di accedere a un metodo di una stringa Null.
int[] values = null;
for (int i = 0; i <= 9; i++)
values[i] = i * 2;
string? lowCaseString = null;
Console.WriteLine(lowCaseString.ToUpper());
OverflowException
Un'eccezione di tipo OverflowException si verifica quando un'operazione aritmetica tenta di assegnare un risultato esterno all'intervallo del tipo di dati di destinazione. Nell'esempio seguente viene generata un'eccezione OverflowException quando si tenta di convertire un decimal valore pari a 400 in una byte variabile.
decimal x = 400;
byte i;
i = (byte)x; // OverflowException occurs
Console.WriteLine(i);
Riepilogo
Ecco i concetti più importanti di questa unità da ricordare:
- Il runtime .NET genera un'eccezione quando un'operazione non riesce.
- Il tipo di eccezione dipende dal codice che causa l'eccezione.
- L'applicazione deve intercettare le eccezioni di runtime.