Sdílet prostřednictvím


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říkazem throw.
  • 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 typu string jen pro čtení, která obsahuje popis důvodu výjimky, který je čitelný pro člověka.
  • InnerException je vlastnost typu Exceptionjen 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á InnerExceptionobjekt .) V opačném případě je nulljeho 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ýjimka System.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í.