Správa výjimek pomocí ladicího programu v sadě Visual Studio
Výjimkou je označení chybového stavu, ke kterému dochází při provádění programu. Ladicí program můžete zjistit, které výjimky nebo sady výjimek se mají přerušit, a v jakém okamžiku chcete, aby ladicí program přerušil (to znamená pozastavit v ladicím programu). Když se ladicí program přeruší, zobrazí se místo vyvolání výjimky. Můžete také přidat nebo odstranit výjimky. Pokud je řešení otevřené v sadě Visual Studio, použijte k otevření okna Výjimka Nastavení příkaz Ladit > výjimku systému Windows > Nastavení.
Poskytněte obslužné rutiny, které reagují na nejdůležitější výjimky. Pokud potřebujete vědět, jak přidat obslužné rutiny pro výjimky, přečtěte si článek Oprava chyb napsáním lepšího kódu jazyka C#. Zjistěte také, jak nakonfigurovat ladicí program tak, aby vždy přerušil provádění některých výjimek.
Když dojde k výjimce, ladicí program zapíše zprávu výjimky do okna Výstup . V následujících případech může přerušit provádění v následujících případech:
- Vyvolá se výjimka, která není zpracována.
- Ladicí program je nakonfigurovaný tak, aby přerušil provádění před vyvolání jakékoli obslužné rutiny.
- Nastavili jste pouze můj kód a ladicí program je nakonfigurovaný tak, aby se přerušil při jakékoli výjimce, která není zpracována v uživatelském kódu.
Poznámka:
ASP.NET má obslužnou rutinu výjimky nejvyšší úrovně, která zobrazuje chybové stránky v prohlížeči. Provádění se neporuší, pokud není zapnutý jenom můj kód . Příklad najdete v části Řekněte ladicímu programu, aby pokračoval v neošetřených výjimkách uživatele níže.
Poznámka:
Ladicí program v aplikaci Visual Basic spravuje všechny chyby jako výjimky, i když používáte obslužné rutiny chyb ve stylu chyby.
Řekněte ladicímu programu, aby přerušil, když dojde k výjimce.
Ladicí program může přerušit provádění v okamžiku, kdy je vyvolána výjimka, takže můžete prozkoumat výjimku před vyvolání obslužné rutiny.
V okně Nastavení výjimky (ladění > výjimek systému Windows > Nastavení) rozbalte uzel pro kategorii výjimek, jako jsou výjimky modulu CLR (Common Language Runtime Exceptions). Potom zaškrtněte políčko pro konkrétní výjimku v rámci této kategorie, například System.AccessViolationException. Můžete také vybrat celou kategorii výjimek.
Tip
Konkrétní výjimky můžete najít pomocí okna Hledání na panelu nástrojů Nastavení výjimky nebo můžete pomocí vyhledávání filtrovat konkrétní obory názvů (například System.IO).
Pokud v okně Nastavení výjimky vyberete výjimku, spuštění ladicího programu se přeruší bez ohledu na to, jestli je výjimka vyvolána, bez ohledu na to, jestli je zpracována. Teď se výjimka nazývá první náhodná výjimka. Tady je například několik scénářů:
V následující konzolové aplikaci jazyka C# vyvolá Metoda Main výjimku AccessViolationException uvnitř
try/catch
bloku.static void Main(string[] args) { try { throw new AccessViolationException(); Console.WriteLine("here"); } catch (Exception e) { Console.WriteLine("caught exception"); } Console.WriteLine("goodbye"); }
Pokud máte AccessViolationException vrácena se změnami Výjimka Nastavení, spuštění se na řádku přeruší
throw
při spuštění tohoto kódu v ladicím programu. Pak můžete pokračovat v provádění. Konzola by měla zobrazit oba řádky:caught exception goodbye
ale nezobrazuje čáru
here
.Konzolová aplikace jazyka C# odkazuje na knihovnu tříd s třídou, která má dvě metody. Jedna metoda vyvolá výjimku a zpracuje ji, zatímco druhá metoda vyvolá stejnou výjimku, ale nezpracuje ji.
public class Class1 { public void ThrowHandledException() { try { throw new AccessViolationException(); } catch (AccessViolationException ave) { Console.WriteLine("caught exception" + ave.Message); } } public void ThrowUnhandledException() { throw new AccessViolationException(); } }
Tady je metoda Main() konzolové aplikace:
static void Main(string[] args) { Class1 class1 = new Class1(); class1.ThrowHandledException(); class1.ThrowUnhandledException(); }
Pokud máte AccessViolationException vrácena v výjimka Nastavení, provádění se přeruší na
throw
řádku v throwHandledException() a ThrowUnhandledException() při spuštění tohoto kódu v ladicím programu.
Pokud chcete obnovit nastavení výjimek na výchozí hodnoty, zvolte obnovit seznam na výchozí tlačítko nastavení :
Informujte ladicí program, aby pokračoval v neošetřených výjimkách uživatele.
Pokud ladíte kód .NET nebo JavaScript pomocí just My Code, můžete ladicímu programu říct, aby zabránil přerušení výjimek, které nejsou zpracovávány v uživatelském kódu, ale jsou zpracovávány jinde.
V okně Výjimka Nastavení otevřete místní nabídku tak, že kliknete pravým tlačítkem myši na popisek sloupce a pak vyberete Zobrazit další akce sloupců>. (Pokud jste vypnuli Jenom můj kód, tento příkaz neuvidíte.) Zobrazí se třetí sloupec s názvem Další akce .
Pro výjimku, která zobrazuje Pokračovat při neošetřeném uživatelském kódu v tomto sloupci, ladicí program pokračuje, pokud tato výjimka není zpracována v uživatelském kódu, ale je zpracována externě.
Chcete-li změnit toto nastavení pro určitou výjimku, vyberte výjimku, kliknutím pravým tlačítkem myši zobrazte místní nabídku a vyberte Pokračovat při neošetřeném uživatelském kódu. Můžete také změnit nastavení pro celou kategorii výjimek, jako jsou například celé výjimky modulu Common Language Runtime).
Například ASP.NET webové aplikace zpracovávají výjimky převodem na stavový kód HTTP 500 (zpracování výjimek ve webovém rozhraní API ASP.NET), které nemusí pomoct určit zdroj výjimky. V následujícím příkladu uživatelský kód volá volání String.Format()
, které vyvolá FormatException. Provádění se přeruší následujícím způsobem:
Přidání a odstranění výjimek
Výjimky můžete přidávat a odstraňovat. Pokud chcete odstranit typ výjimky z kategorie, vyberte výjimku a na panelu nástrojů Nastavení Výjimka vyberte tlačítko Odstranit vybranou výjimku ze seznamu (znaménko mínus). Nebo můžete kliknout pravým tlačítkem myši na výjimku a v místní nabídce vybrat Odstranit . Odstranění výjimky má stejný účinek jako zrušení výjimky, což znamená, že ladicí program se při vyvolání přeruší.
Přidání výjimky:
V okně Výjimka Nastavení vyberte jednu z kategorií výjimek (například Common Language Runtime).
Zvolte tlačítko Přidat výjimku k vybrané kategorii (znaménko plus).
Zadejte název výjimky (například System.UriTemplateMatchException).
Výjimka se přidá do seznamu (v abecedním pořadí) a automaticky se zaškrtne.
Pokud chcete přidat výjimku z výjimek paměti GPU, výjimky modulu runtime JavaScriptu nebo kategorie výjimek Win32, uveďte kód chyby a popis.
Tip
Zkontrolujte pravopis. Okno Výjimka Nastavení nekontroluje existenci přidané výjimky. Pokud tedy zadáte Sytem.UriTemplateMatchException, získáte pro tuto výjimku položku (a ne pro System.UriTemplateMatchException).
Nastavení výjimek se uchovávají v souboru .suo řešení, takže se vztahují na konkrétní řešení. V různých řešeních nemůžete znovu použít konkrétní nastavení výjimek. Nyní jsou zachovány pouze přidané výjimky; odstraněné výjimky nejsou. Můžete přidat výjimku, zavřít a znovu otevřít řešení a výjimka bude stále k dispozici. Pokud ale odstraníte výjimku a řešení zavřete nebo znovu otevřete, výjimka se znovu zobrazí.
Okno Nastavení výjimky podporuje obecné typy výjimek v jazyce C#, ale ne v jazyce Visual Basic. Chcete-li přerušit výjimky jako MyNamespace.GenericException<T>
, musíte přidat výjimku jako MyNamespace.GenericException'1. To znamená, že pokud jste vytvořili výjimku, jako je tento kód:
public class GenericException<T> : Exception
{
public GenericException() : base("This is a generic exception.")
{
}
}
Výjimku můžete přidat do výjimky Nastavení pomocí předchozího postupu:
Přidání podmínek k výjimce
K nastavení podmínek pro výjimky použijte okno Nastavení výjimky. V současné době podporované podmínky zahrnují názvy modulů, které se mají zahrnout nebo vyloučit pro výjimku. Když nastavíte názvy modulů jako podmínky, můžete se rozhodnout pro výjimku přerušit pouze u určitých modulů kódu. Můžete se také rozhodnout, abyste se vyhnuli přerušení konkrétních modulů.
Poznámka:
Přidání podmínek k výjimce se podporuje od sady Visual Studio 2017.
Přidání podmíněných výjimek:
Zvolte tlačítko Upravit podmínky v okně Výjimka Nastavení nebo klikněte pravým tlačítkem myši na výjimku a zvolte Upravit podmínky.
Pokud chcete k výjimce přidat další požadované podmínky, vyberte přidat podmínku pro každou novou podmínku. Zobrazí se další řádky podmínky.
Pro každý řádek podmínky zadejte název modulu a změňte seznam relačních operátorů na Rovná se nebo Nerovná se. V názvu můžete zadat zástupné cardy (\*) a zadat více než jeden modul.
Pokud potřebujete odstranit podmínku, zvolte X na konci řádku podmínky.