Cvičení – implementace zpracování výjimek try-catch
Vzor try-catch se skládá z try bloku následovaného jednou nebo více catch klauzulí. Každá catch klauzule určuje obslužnou rutinu pro jiný typ výjimky.
Při vyvolání výjimky modul CLR (Common Language Runtime) vyhledá catch klauzuli, která dokáže výjimku zpracovat. Pokud aktuálně spuštěná metoda neobsahuje catch klauzuli, která dokáže zpracovat vyvolaný typ výjimky, CLR vyhledá metodu, která volala aktuální metodu. Hledání pokračuje v zásobníku volání až do nalezení vhodné catch klauzule. Pokud není nalezena žádná catch klauzule pro zpracování výjimky, CLR zobrazí neošetřenou zprávu o výjimce uživateli a zastaví provádění programu.
V tomto cvičení implementujete základní try-catch vzor.
Vytvoření nového projektu kódu
Prvním krokem je vytvoření projektu kódu, který použijete během tohoto modulu.
Otevřete novou instanci editoru Visual Studio Code.
V nabídce Soubor vyberte Otevřít složku.
V dialogovém okně Otevřít složku přejděte do složky Windows Desktop .
V dialogovém okně Otevřít složku vyberte Nová složka.
Pojmenujte novou složku Exceptions101 a pak vyberte Vybrat složku.
V nabídce Terminál vyberte Nový terminál.
K vytvoření nové konzolové aplikace použijete příkaz .NET CLI.
Na příkazovém řádku panelu TERMINÁL zadejte následující příkazy:
dotnet new consoleZavřete panel TERMINÁL.
Implementace jednoduchého try-catchu
Pomocí zobrazení Průzkumníka editoru Visual Studio Code otevřete soubor Program.cs.
V nabídce Zobrazit vyberte paletu příkazů.
Na příkazovém řádku zadejte .net: g a pak vyberte .NET: Generovat prostředky pro sestavení a ladění.
Obsah souboru Program.cs nahraďte následujícím kódem:
double float1 = 3000.0; double float2 = 0.0; int number1 = 3000; int number2 = 0; Console.WriteLine(float1 / float2); Console.WriteLine(number1 / number2); Console.WriteLine("Exit program");Prohlédněte si kód za minutu.
Všimněte si, že aplikace používá dva číselné typy proměnných
doubleaint. Kód provede výpočet dělení pomocí obou číselných typů.Vývojáři používají pro výpočty proměnnou
doubletypu, pokud jsou přesné desetinné hodnoty důležité.V nabídce Spustit vyberte Spustit ladění.
Všimněte si, že
DivideByZeroExceptionpři dělení celočíselné hodnoty dojde k výjimce.Poznámka:
Možná jste si všimli, že rovnice používající proměnné typu
doubleje schopna dokončit, aniž by způsobila chybu. Výpočet dělení nulou pomocí proměnných typudoublevrátí výsledek rovnající se nekonečnu, -nekonečnu nebo "není číslo". To neznamená, že byste měli vždy používat proměnné typudoublenamísto typůintnebodecimal. Správným přístupem je použití proměnných příslušného typu a implementace zpracování výjimek k zachycení chyb, ke kterým může dojít.Na panelu nástrojů Ladění vyberte Pokračovat.
Udělejte si chvilku na prohlédnutí výstupu zprávy pro vaši aplikaci.
∞ Unhandled exception. System.DivideByZeroException: Attempted to divide by zero. at Program.<Main>$(String[] args) in C:\Users\msuser\Desktop\Exceptions101\Program.cs:line 7Všimněte si, že neošetřená výjimka způsobila vypnutí aplikace po dokončení prvního
Console.WriteLine()příkazu.Poznámka:
Visual Studio Code ve výchozím nastavení používá k zobrazení zpráv vygenerovaných ladicím programem jiný barevný text. To pomáhá vývojáři rozlišovat mezi výstupem aplikace a zprávami ladicího programu. Pokud chcete přehlednější zobrazení výstupu aplikace, můžete nakonfigurovat launch.json soubor tak, aby používal jinou konzolu. Například nastavte
consolenaintegratedTerminalpro používání panelu TERMINAL pro výstup aplikace. Zprávy ladicího programu se vždy zobrazují na panelu KONZOLY LADĚNÍ.Dva výpočty uzavřete do bloku
trykódu příkazu následujícím způsobem:double float1 = 3000.0; double float2 = 0.0; int number1 = 3000; int number2 = 0; try { Console.WriteLine(float1 / float2); Console.WriteLine(number1 / number2); } Console.WriteLine("Exit program");Všimněte si červené vlnovky pod zavírací závorkou bloku
try.Syntaxe jazyka C# vyžaduje klauzuli
catchnebofinally, pokud používáte příkaztry.Vytvořte
catchblok kódu pod blokemtrykódu následujícím způsobem:try { Console.WriteLine(float1 / float2); Console.WriteLine(number1 / number2); } catch { Console.WriteLine("An exception has been caught"); }V nabídce Soubor editoru Visual Studio Code vyberte Uložit.
V nabídce Spustit vyberte Spustit ladění.
Věnujte chvilku prohlížení výstupu, který vaše aplikace vytvořila.
∞ An exception has been caught Exit programVšimněte si, že i když k výjimce stále dochází, je teď možné dokončit provádění zbývajících řádků kódu před zavřením.
Zpracování výjimek umožňuje řídit provádění kódu, když dojde k výjimkám. Zpracování výjimek pomáhá zajistit, aby byl váš kód stabilní a vytvořil očekávané výsledky.
Zachytávat výjimky vyvolané volanými metodami
V mnoha případech je výjimka zachycena na té úrovni zásobníku volání, která je nižší než úroveň, kde byla vyvolána.
Když dojde k vyvolání výjimky a aktuální metoda výjimku nezachytí, modul CLR (Common Language Runtime) rozvolní zásobník a vyhledá metodu catch obsahující klauzuli, která dokáže výjimku zpracovat. První catch klauzule, která dokáže zpracovat výjimku, se spustí. Pokud se v zásobníku volání nenajde žádná vhodná catch klauzule, modul CLR (Common Language Runtime) proces ukončí a zobrazí uživateli chybovou zprávu.
Nahraďte kód v souboru Program.cs následujícím kódem:
try { Process1(); } catch { Console.WriteLine("An exception has occurred"); } Console.WriteLine("Exit program"); static void Process1() { WriteMessage(); } static void WriteMessage() { double float1 = 3000.0; double float2 = 0.0; int number1 = 3000; int number2 = 0; Console.WriteLine(float1 / float2); Console.WriteLine(number1 / number2); }Věnujte chvíli prohlédnutí aktualizovaného kódu.
- Příkazy nejvyšší úrovně zahrnují
tryblok kódu, který volá metoduProcess1(). - Metoda
Process1()volá metoduWriteMessage(). - Metoda
WriteMessage()obsahuje kód, kde bude vyvolána výjimkaDivideByZeroException.
Všimněte si, že výjimka se vygeneruje v metodě, která je o dvě úrovně nad zásobníkem volání nad bloky kódu
tryacatch.
Příkazy nejvyšší úrovně jsou reprezentovány jako metoda pojmenovaná
Mainv zásobníku volání.- Příkazy nejvyšší úrovně zahrnují
V nabídce Soubor editoru Visual Studio Code vyberte Uložit.
V nabídce Spustit vyberte Spustit ladění.
Věnujte chvilku prohlížení výstupu, který vaše aplikace vytvořila.
∞ An exception has occurred Exit programVšimněte si, že i když je výjimka vyvolána o dvě úrovně výše v zásobníku volání, je stále úspěšně zpracována.
Rekapitulace
Tady je několik důležitých věcí, které je potřeba si z této lekce zapamatovat:
-
try-catchImplementujte vzor protryzadané řádky kódu v rámci vaší aplikace acatchvýjimky, ke kterým dochází v rámci rozsahutrybloku kódu. -
catchPomocí klauzule můžete zachytit výjimku vyvolanou na stejné úrovni zásobníku volání. - Použijte klauzuli
catchk zachycení výjimky vyvolané na vyšší úrovni zásobníku volání.