21 Výjimky
21.1 Obecné
Výjimky v jazyce C# poskytují strukturovaný, jednotný a typově bezpečný způsob zpracování chyb na úrovni systému i chybových podmínek na úrovni aplikace.
21.2 Příčiny výjimek
Výjimky se dají vyvolat dvěma různými způsoby.
- Prohlášení
throw
(§13.10.6) vyvolá výjimku okamžitě a bezpodmínečně. Ovládací prvek nikdy nedosáhne příkazu bezprostředně za příkazemthrow
. - Určité mimořádné podmínky, které vznikají při zpracování příkazů a výrazů jazyka C#, způsobí, že se za určitých okolností vyvolá výjimka, když operaci nelze normálně dokončit. Seznam různých výjimek, které lze tímto způsobem vyvolat, naleznete v části §21.5 .
Příklad: Operace dělení celého čísla (§12.10.3) vyvolá
System.DivideByZeroException
hodnotu, pokud jmenovatel je nula. end example
21.3 Třída System.Exception
Třída System.Exception
je základním typem všech výjimek. Tato třída má několik zajímavých vlastností, které všechny výjimky sdílejí:
Message
je vlastnost typustring
jen pro čtení, která obsahuje popis důvodu výjimky, který je čitelný pro člověka.InnerException
je vlastnost typuException
jen pro čtení . Pokud jeho hodnota není,null
odkazuje na výjimku, která způsobila aktuální výjimku. (To znamená, že aktuální výjimka byla vyvolána v bloku catch, který zpracováváInnerException
objekt .) V opačném případě jenull
jeho hodnota označující, že tato výjimka nebyla způsobena jinou výjimkou. Počet objektů výjimek zřetězených tímto způsobem může být libovolný.
Hodnotu těchto vlastností lze zadat ve volání konstruktoru instance pro System.Exception
.
21.4 Jak se zpracovávají výjimky
Výjimky se zpracovávají příkazem try
(§13.11).
Při vyvolání výjimky (§21.2) systém vyhledá nejbližší klauzuli catch, která dokáže zpracovat výjimku podle typu běhu výjimky. Nejprve je aktuální metoda hledá lexicky uzavřený try
příkaz a přidružené catch
klauzule try
příkazu jsou považovány za v pořadí. Pokud se to nezdaří, metoda, která volala aktuální metodu, se vyhledá lexicky uzavřený try
příkaz, který ohraničuje bod volání aktuální metody. Toto hledání pokračuje, dokud catch
se nenajde klauzule, která dokáže zpracovat aktuální výjimku, pojmenováním třídy výjimky, která je stejná třída nebo základní třída typu běhu vyvolané výjimky. catch
Klauzule, která nenázví třídu výjimky, dokáže zpracovat jakoukoli výjimku.
Jakmile se najde odpovídající catch
klauzule, systém se připraví k převodu řízení na první příkaz catch
klauzule. Před spuštěním catch
klauzule se systém nejprve spustí v pořadí, všechny finally
klauzule přidružené k try
příkazům, které byly více vnořené, než ta, která chytila výjimku.
Pokud se nenajde žádná odpovídající catch
klauzule:
- Pokud hledání odpovídající
catch
klauzule dosáhne statického konstruktoru (§15.12) nebo inicializátoru statického pole,System.TypeInitializationException
vyvolá se vyvolání statického konstruktoru vyvoláním. Vnitřní výjimkaSystem.TypeInitializationException
obsahuje výjimku, která byla původně vyvolán. - V opačném případě, pokud dojde k výjimce během dokončení provádění a tato výjimka není zachycena, pak chování není určeno.
- V opačném případě, pokud hledání odpovídajících
catch
klauzulí dosáhne kódu, který původně spustil vlákno, je spuštění vlákna ukončeno. Dopad takového ukončení je definován implementací.
21.5 Běžné třídy výjimek
Některé operace jazyka C# vyvolá následující výjimky.
Typ výjimky | Popis |
---|---|
System.ArithmeticException |
Základní třída pro výjimky, ke kterým dochází během aritmetických operací, například System.DivideByZeroException a System.OverflowException . |
System.ArrayTypeMismatchException |
Vyvolá se, když úložiště do pole selže, protože typ uloženého prvku není kompatibilní s typem pole. |
System.DivideByZeroException |
Vyvolá se, když dojde k pokusu o dělení celočíselné hodnoty nulou. |
System.IndexOutOfRangeException |
Vyvolá se při pokusu o indexování pole prostřednictvím indexu, který je menší než nula nebo mimo hranice pole. |
System.InvalidCastException |
Vyvolá se, když explicitní převod ze základního typu nebo rozhraní na odvozený typ selže za běhu. |
System.NullReferenceException |
Vyvolá se při null použití odkazu způsobem, který způsobí, že odkazovaný objekt bude vyžadován. |
System.OutOfMemoryException |
Vyvolá se, když dojde k selhání pokusu o přidělení paměti (prostřednictvím new ). |
System.OverflowException |
Vyvolá se při aritmetické operaci v checked kontextu přetečení. |
System.StackOverflowException |
Vyvolá se, když je zásobník spouštění vyčerpán příliš mnoha nevyřízenými voláními; obvykle značí velmi hlubokou nebo nevázanou rekurze. |
System.TypeInitializationException |
Vyvolá se, když statický konstruktor nebo inicializátor statického pole vyvolá výjimku a neexistuje žádná catch klauzule pro zachycení. |
ECMA C# draft specification