Cvičení – implementace zpracování výjimek try-catch

Dokončeno

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.

  1. Otevřete novou instanci editoru Visual Studio Code.

  2. V nabídce Soubor vyberte Otevřít složku.

  3. V dialogovém okně Otevřít složku přejděte do složky Windows Desktop .

  4. V dialogovém okně Otevřít složku vyberte Nová složka.

  5. Pojmenujte novou složku Exceptions101 a pak vyberte Vybrat složku.

  6. V nabídce Terminál vyberte Nový terminál.

    K vytvoření nové konzolové aplikace použijete příkaz .NET CLI.

  7. Na příkazovém řádku panelu TERMINÁL zadejte následující příkazy:

    dotnet new console
    
  8. Zavřete panel TERMINÁL.

Implementace jednoduchého try-catchu

  1. Pomocí zobrazení Průzkumníka editoru Visual Studio Code otevřete soubor Program.cs.

  2. V nabídce Zobrazit vyberte paletu příkazů.

  3. Na příkazovém řádku zadejte .net: g a pak vyberte .NET: Generovat prostředky pro sestavení a ladění.

  4. 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");
    
  5. Prohlédněte si kód za minutu.

    Všimněte si, že aplikace používá dva číselné typy proměnných double a int. Kód provede výpočet dělení pomocí obou číselných typů.

    Vývojáři používají pro výpočty proměnnou double typu, pokud jsou přesné desetinné hodnoty důležité.

  6. V nabídce Spustit vyberte Spustit ladění.

    Všimněte si, že DivideByZeroException př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 double je schopna dokončit, aniž by způsobila chybu. Výpočet dělení nulou pomocí proměnných typu double vrá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é typu double namísto typů int nebo decimal. 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.

  7. Na panelu nástrojů Ladění vyberte Pokračovat.

    Snímek obrazovky s tlačítkem Pokračovat na panelu nástrojů Ladění

  8. 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 7
    

    Vš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 console na integratedTerminal pro používání panelu TERMINAL pro výstup aplikace. Zprávy ladicího programu se vždy zobrazují na panelu KONZOLY LADĚNÍ.

  9. Dva výpočty uzavřete do bloku try kó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");
    
  10. Všimněte si červené vlnovky pod zavírací závorkou bloku try.

    Syntaxe jazyka C# vyžaduje klauzuli catch nebo finally, pokud používáte příkaz try.

  11. Vytvořte catch blok kódu pod blokem try kódu následujícím způsobem:

    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    catch
    {
        Console.WriteLine("An exception has been caught");
    }
    
  12. V nabídce Soubor editoru Visual Studio Code vyberte Uložit.

  13. V nabídce Spustit vyberte Spustit ladění.

  14. Věnujte chvilku prohlížení výstupu, který vaše aplikace vytvořila.

    ∞
    An exception has been caught
    Exit program
    
  15. Vš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.

  1. 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);
    }
    
  2. Věnujte chvíli prohlédnutí aktualizovaného kódu.

    • Příkazy nejvyšší úrovně zahrnují try blok kódu, který volá metodu Process1() .
    • Metoda Process1() volá metodu WriteMessage() .
    • Metoda WriteMessage() obsahuje kód, kde bude vyvolána výjimka DivideByZeroException.

    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 try a catch.

    Snímek obrazovky znázorňující úrovně zásobníku volání mezi vyvoláním výjimky a umístěním, kde je zachycena

    Příkazy nejvyšší úrovně jsou reprezentovány jako metoda pojmenovaná Main v zásobníku volání.

  3. V nabídce Soubor editoru Visual Studio Code vyberte Uložit.

  4. V nabídce Spustit vyberte Spustit ladění.

  5. Věnujte chvilku prohlížení výstupu, který vaše aplikace vytvořila.

    ∞
    An exception has occurred
    Exit program
    
  6. Vš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-catch Implementujte vzor pro try zadané řádky kódu v rámci vaší aplikace a catch výjimky, ke kterým dochází v rámci rozsahu try bloku kódu.
  • catch Pomocí klauzule můžete zachytit výjimku vyvolanou na stejné úrovni zásobníku volání.
  • Použijte klauzuli catch k zachycení výjimky vyvolané na vyšší úrovni zásobníku volání.