Sdílet prostřednictvím


Zpracování a vyvolání výjimek

Aplikace musí být schopny zpracovávat chyby, ke kterým dojde za běhu konzistentním způsobem. Modul CLR poskytuje model pro oznamování chyb aplikace jednotným způsobem. Všechny operace rozhraní .NET Framework označují selhání vyvoláním výjimek.

Toto téma obsahuje následující části:

  • Výjimky v rozhraní .NET Framework

  • Výjimky vs. Tradiční metody zpracování chyb

  • Jak modul runtime spravuje výjimky

  • Filtrování výjimek modulu runtime

  • Příbuzná témata

  • Odkaz

Výjimky v rozhraní .NET Framework

Výjimka je libovolná chyba nebo neočekávané chování, které se vyskytne během vykonávání programu. Výjimky lze vyvolat z důvodu chyby ve vašem kódu nebo v kódu, který voláte (například sdílená knihovna), z důvodu nedostatečných systémových prostředků, neočekávaných podmínek modulu CLR (například kód, který nemůže být ověřen) a tak dále. Aplikace se může zotavit z některých těchto podmínek, ale nikoli ze všech. Přestože je možno zotavení z většiny aplikačních výjimek, není možné zotavení z většiny výjimek modulu runtime.

V rozhraní .NET Framework je výjimka objektem, který dědí z třídy System.Exception. Výjimka je vyvolána v oblasti kódu, kde došlo k problému. Výjimka je předána na vrchol zásobníku dokud ji aplikace nezpracuje nebo není program ukončen.

Zpět na začátek

Výjimky vs.Tradiční metody zpracování chyb

Tradičně model zpracování chyb jazyka spoléhal na jedinečný způsob zjištění chyb jazykem a na vyhledání příslušné obslužné rutiny, nebo na mechanismus zpracování chyb poskytnutý operačním systémem. Modul runtime implementuje zpracování výjimek následujícím způsobem:

  • Zpracovává výjimky bez ohledu na jazyk, který generuje výjimky nebo jazyk, který je zpracovává.

  • Nevyžaduje žádnou konkrétní jazykovou syntaxi pro zpracování výjimek, ale umožňuje každému jazyku definovat vlastní syntaxi.

  • Umožňuje, aby byly výjimky vyvolány i přes hranice procesu a dokonce i přes hranice počítače.

Výjimky nabízí několik výhod oproti jiným metodám oznámování chyb, jako jsou například návratové kódy. K selhání nedojde bez upozornění. Neplatné hodnoty se dále nešíří v systému. Nemusíte kontrolovat návratové kódy. Kód pro zpracování výjimek lze snadno přidat pro zvýšení spolehlivosti programu. Zpracování výjimek modulem runtime je navíc rychlejší než zpracování chyb v C++ určeném pro systém Windows.

Protože vlákna během spuštění rutinně střídají spravované a nespravované bloky kódu, může modul runtime vyvolat nebo zachytit výjimky ve spravovaném nebo nespravovaném kódu. Nespravovaný kód může obsahovat výjimky C++ stylu SEH a HRESULTS založené na modelu COM.

Jak modul runtime spravuje výjimky

Modul runtime používá model zpracování výjimek na základě objektů výjimek a chráněných bloků kódu. Objekt Exception, který představuje výjimku je vytvořen, když dojde v výjimce.

Modul runtime vytvoří pro každý spustitelný soubor tabulku s informacemi o výjimkách. Každá metoda spustitelného souboru má přidružené pole informací o zpracování výjimek (které může být prázdné) v tabulce s informacemi o výjimkách. Každá položka v poli popisuje chráněný blok kódu, veškeré filtry výjimek spojené s tímto kódem a jakékoli obslužné rutiny výjimek (příkazy catch). Tato tabulka výjimek je velmi efektivní a nezpůsobuje žádné snížení výkonu vzhledem k procesorovému času nebo využití paměti, když dojde k výjimce. Prostředky využíváte pouze tehdy, když se vyvolá výjimka.

Tabulka s informacemi o výjimkách představuje čtyři typy obslužných rutin výjimek pro chráněné bloky:

  • Obslužná rutina finally, která se spouští při každém ukončení bloku, v případě, že k ukončení dojde na základě normálního toku řízení nebo neošetřené výjimky.

  • Obslužná rutina chyb, která musí být provedena, když dojde k vyvolání výjimky, ale není provedena po dokončení na základě normálního toku řízení.

  • Obslužná rutina s filtrováním typů, která zpracovává jakoukoli výjimku určené třídy nebo některé z jejich odvozených tříd.

  • Obslužná rutina s filtrováním typů, která spouští uživatelem zadaný kód pro určení, zda výjimka má být zpracována přidruženou obslužnou rutinou nebo by měla být předána dalšímu chráněnému bloku.

Každý jazyk implementuje tyto obslužné rutiny výjimek podle jeho specifikace. Například Visual Basic umožňuje přístup k uživatelem filtrovaným obslužným rutinám prostřednictvím porovnání proměnné (použitím klíčového slova When) v příkazu catch; jazyk C# neimplementuje uživatelem filtrované obslužné rutiny.

Pokud dojde k výjimce, začíná modul runtime dvoustupňový proces:

  1. Modul runtime vyhledá v poli první chráněný blok, který provádí následující:

    • Chrání oblast, která zahrnuje aktuálně vykonávanou instrukci.

    • Obsahuje obslužnou rutinu výjimek nebo obsahuje filtr, který zpracovává výjimky.

  2. Pokud nastane shoda, modul runtime vytvoří objekt Exception, který popisuje tuto výjimku. Modul runtime poté provede všechny příkazy finally nebo chybné příkazy mezi příkazem, kde se vyskytla výjimka a příkazem, který zpracovává výjimku. Všimněte si, že pořadí obslužných rutin výjimek je důležité. Vnitřní výjimka je vyhodnocena jako první v pořadí. Všimněte si také, že obslužné rutiny výjimek mohou přístupovat k lokálním proměnným a k lokální paměti rutiny, která zachytí výjimku, ale všechny zprostředkované hodnoty z doby, kdy je výjimka vyvolána budou ztraceny.

    V případě, že žádná shoda v aktuální metodě nenastane, modul runtime prohledá všechny volající aktuální metody a pokračuje v této cestě až na vrchol zásobníku. Pokud se neshoduje žádný volající, modul runtime umožní ladícímu programu přístup k výjimce. Pokud se ladicí nástroj nepřipojí k výjimce, modul runtime vyvolává událost AppDomain.UnhandledException. Pokud neexistují žádní posluchače pro tuto událost, modul runtime vypíše trasování zásobníku a ukončí aplikaci.

Zpět na začátek

Filtrování výjimek modulu runtime

Je možné filtrovat výjimky, které zachytíte a zpracovat je podle typu nebo podle některých kritérií definovaných uživatelem.

Obslužné rutiny s filtrováním podle typu spravují určitý typ výjimek (nebo třídy odvozené od ní). Následující příklad ukazuje obslužné rutiny s filtrováním podle typu, které je navrženo pro zachycení zvláštních výjimek, v tomto případě FileNotFoundException.

Catch e As FileNotFoundException
    Console.WriteLine("[Data File Missing] {0}", e)
catch (FileNotFoundException e)
{
    Console.WriteLine("[Data File Missing] {0}", e);
}
catch (FileNotFoundException^ e)
{
    Console::WriteLine("[Data File Missing] {0}", e);
}

Uživatelem filtrované vyjímky v obslužné rutině zachycují a zpracovávají výjimky založené na požadavcích, které zadáte ve výjimce. Další informace o filtrování výjimek tímto způsobem naleznete v tématu Using Specific Exceptions in a Catch Block.

Zpět na začátek

Příbuzná témata

Title

Popis

Třída výjimek a vlastnosti

Popisuje prvky objektu výjimky.

Hierarchie výjimek

Popisuje výjimky, ze kterých je odvozena většina výjimek.

Základy zpracování výjimek

Vysvětluje, jak zpracovat výjimky pomocí příkazů catch, throw a finally.

Doporučené postupy pro zpracování výjimek

Popisuje doporučené metody pro zpracování výjimek.

Zpracování výjimek zprostředkovatele komunikace s objekty COM

Popisuje způsob zpracování výjimek vyvolaných a zachycených v nespravovaném kódu.

How to: Map HRESULTs and Exceptions

Popisuje mapování výjimek mezi spravovaným a nespravovaným kódem.

Zpět na začátek

Odkaz

System.Exception

System.ApplicationException

System.SystemException