Sdílet prostřednictvím


Výjimky a zpracování výjimek

Funkce zpracování výjimek jazyka C# pomáhají řešit neočekávané nebo výjimečné situace, ke kterým dochází při spuštění programu. Zpracování výjimek používá klíčová slova try, catch a finally pro vyzkoušení akcí, které nemusí proběhnout úspěšně, ke zpracování selhání, pokud se rozhodnete, že je to rozumné, a k vyčištění prostředků následně. Výjimky mohou být generovány modulem CLR (Common Language Runtime), knihovnami .NET nebo knihovnami třetích stran nebo kódem aplikace. Výjimky se vytvářejí pomocí klíčového throw slova.

V mnoha případech může být výjimka vyvolána ne metodou, kterou váš kód volal přímo, ale jinou metodou dále v zásobníku volání. Když dojde k vyvolání výjimky, CLR rozbalí zásobník, vyhledá metodu s blokem catch pro konkrétní typ výjimky a spustí první takový catch blok, který najde. Pokud nenajde žádný vhodný catch blok kdekoli v zásobníku volání, proces se ukončí a uživateli se zobrazí zpráva.

V tomto příkladu metoda testuje dělení nulou a zachytí chybu. Bez zpracování výjimek by se tento program ukončil s chybou DivideByZeroException nebyla ošetřena.

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Přehled výjimek

Výjimky mají následující vlastnosti:

  • Výjimky jsou typy, které jsou všechny nakonec odvozeny od System.Exception.
  • try Kolem příkazů, které můžou vyvolat výjimky, použijte blok.
  • Jakmile v bloku try nastane výjimka, tok řízení přeskočí na první přidruženou obsluhu výjimky, která se nachází kdekoliv v zásobníku volání. V jazyce C# se klíčové slovo catch používá k definování obslužné rutiny výjimky.
  • Pokud neexistuje žádná obslužná rutina výjimky pro danou výjimku, program se zastaví s chybovou zprávou.
  • Nezachyťte výjimku, pokud ji nezvládnete a neopustíte aplikaci ve známém stavu. Pokud ho zachytíte System.Exception, znovu ho vyhoďte pomocí klíčového slova throw na konci bloku catch.
  • catch Pokud blok definuje proměnnou výjimky, můžete ji použít k získání dalších informací o typu výjimky, ke které došlo.
  • Výjimky můžou program explicitně generovat pomocí klíčového throw slova.
  • Objekty výjimky obsahují podrobné informace o chybě, například stav zásobníku volání a textový popis chyby.
  • Kód v finally bloku se spustí bez ohledu na to, jestli je vyvolána výjimka. finally Pomocí bloku můžete uvolnit prostředky, například zavřít všechny streamy nebo soubory, které byly otevřeny v try bloku.
  • Spravované výjimky v .NET se implementují nad mechanismem strukturovaného zpracování výjimek Win32. Další informace naleznete v tématu Strukturované zpracování výjimek (C/C++) a Krátký úvod do hloubky strukturovaného zpracování výjimek Win32.

Specifikace jazyka C#

Další informace najdete v tématu Výjimky ve specifikaci jazyka C#. Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.

Viz také