Prozkoumání výjimek generovaných kompilátorem
- 10 min
Výjimky jsou generovány modulem runtime .NET nebo kódem v programu. Typ výjimky závisí na kódu, který výjimku způsobuje.
Výjimky generované kompilátorem
Modul runtime .NET vyvolá výjimky při selhání základních operací. Tady je krátký seznam výjimek modulu runtime a jejich chybových podmínek:
-
ArrayTypeMismatchException: Vyvolá se, když pole nemůže uložit daný prvek, protože skutečný typ prvku není kompatibilní se skutečným typem pole. -
DivideByZeroException: Vyvolá se při pokusu o dělení celočíselné hodnoty nulou. -
FormatException: Vyvolá se, když je formát argumentu neplatný. -
IndexOutOfRangeException: Vyvolá se při pokusu o indexování pole, pokud je index menší než nula nebo mimo hranice pole. -
InvalidCastException: Vyvolá se, když explicitní převod ze základního typu na rozhraní nebo na odvozený typ selže za běhu. -
NullReferenceException: Vyvolá se při pokusu o odkaz na objekt, jehož hodnota je null. -
OverflowException: Vyvolá se při aritmetické operaci v kontrolovaném kontextu přeteče.
Ukázky kódu pro výjimky generované kompilátorem
Následující ukázky kódu ukazují příklad kódu, který způsobuje výjimku vygenerovanou kompilátorem.
ArrayTypeMismatchException
Výjimka typu ArrayTypeMismatchException je vyvolána při pokusu o uložení prvku nesprávného typu do pole. Následující příklad vyvolá ArrayTypeMismatchException výjimku při pokusu o uložení číselné hodnoty v řetězcovém poli.
string[] names = { "Dog", "Cat", "Fish" };
Object[] objs = (Object[])names;
Object obj = (Object)13;
objs[2] = obj; // ArrayTypeMismatchException occurs
DivideByZeroException
Při pokusu o dělení celého čísla nebo desetinného čísla nulou dojde k výjimce typu DivideByZeroException . Následující příklad vyvolá DivideByZeroException výjimku při provádění celočíselné dělení.
int number1 = 3000;
int number2 = 0;
Console.WriteLine(number1 / number2); // DivideByZeroException occurs
Poznámka:
Dělení hodnoty s plovoucí řádovou čárkou nulou nevyvolá výjimku; výsledkem je kladné nekonečno, záporné nekonečno nebo není číslo (NaN), podle pravidel IEEE 754 aritmetiky.
Výjimka formátu
Výjimka typu FormatException nastane, když je formát argumentu neplatný nebo pokud složený formát řetězec není správně vytvořen. Následující příklad vyvolá výjimku při pokusu FormatException o převod řetězce na celé číslo.
int valueEntered;
string userValue = "two";
valueEntered = int.Parse(userValue); // FormatException occurs
IndexOutOfRangeException
Výjimka typu IndexOutOfRangeException je vyvolána při pokusu o přístup k prvku pole nebo kolekce s indexem, který je mimo jeho hranice. Následující příklad vyvolá výjimku při pokusu IndexOutOfRangeException o přiřazení posledního values1 prvku pole k poslednímu values2 prvku pole.
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
Při pokusu o neplatné přetypování nebo explicitní převod je vyvolána výjimka typu InvalidCastException. Následující příklad vyvolá výjimku InvalidCastException, když se pokusí přetypovat hodnotu object typu řetězec na proměnnou int.
object obj = "This is a string";
int num = (int)obj;
NullReferenceException
Výjimka typu NullReferenceException je vyvolána při pokusu o přístup k členu objektu, jehož hodnota je null. Zobrazí se dva příklady. V prvním příkladu NullReferenceException je vyvolán při pokusu o přístup k prvku pole null. Druhý příklad vyvolá NullReferenceException při pokusu o přístup k metodě nulového řetězce.
int[] values = null;
for (int i = 0; i <= 9; i++)
values[i] = i * 2;
string? lowCaseString = null;
Console.WriteLine(lowCaseString.ToUpper());
OverflowException
Výjimka typu OverflowException nastane, když se aritmetická operace pokusí přiřadit výsledek, který je mimo rozsah cílového datového typu. Následující příklad vyvolá výjimku při pokusu OverflowException o převod decimal hodnoty 400 na proměnnou byte .
decimal x = 400;
byte i;
i = (byte)x; // OverflowException occurs
Console.WriteLine(i);
Rekapitulace
Tady je několik důležitých věcí, které je potřeba si z této lekce zapamatovat:
- Modul runtime .NET vyvolá výjimku, když operace selže.
- Typ výjimky závisí na kódu, který výjimku způsobuje.
- Aplikace by měla zachytit výjimky modulu runtime.