Výjimky a jejich zpracování

Funkce zpracování výjimek jazyka C# vám pomůžou řešit neočekávané nebo výjimečné situace, ke kterým dochází při spuštění programu. Zpracovánívýjimekchch kódech používá trycatchfinally k vyzkoušení akcí, které nemusí být úspěšné, a při rozhodování, že je vhodné to udělat a poté vyčistit prostředky. Výjimky lze vygenerovat 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 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 zruší zásobník, vyhledá metodu s blokem catch pro konkrétní typ výjimky a spustí první catch takový blok, který najde. Pokud nenajde žádný vhodný catch blok kdekoli v zásobníku volání, proces ukončí a zobrazí zprávu uživateli.

V tomto příkladu metoda testuje dělení podle nuly a zachytí chybu. Bez zpracování výjimek by tento program ukončil chybu DivideByZeroException .

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("{0} divided by {1} = {2}", a, 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 nakonec odvozeny od System.Exception.
  • try Použijte blok kolem příkazů, které můžou vyvolat výjimky.
  • Jakmile dojde k výjimce v try bloku, tok řízení přeskočí na první přidruženou obslužnou rutinu výjimky, která je přítomna kdekoli v zásobníku volání. V jazyce C# catch se klíčové slovo používá k definování obslužné rutiny výjimky.
  • Pokud není k dispozici žádná obslužná rutina výjimky pro danou výjimku, program se zastaví s chybovou zprávou.
  • Nezachyťte výjimku, pokud ji nemůžete zpracovat a nechat aplikaci ve známém stavu. Pokud ho zachytíte System.Exception, znovu ho na konci bloku přetáhnete pomocí throw klíčového catch slova.
  • 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 lze explicitně vygenerovat programem pomocí klíčového throw slova.
  • Objekty výjimek 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 dojde k výjimce. finally Blok můžete použít k uvolnění prostředků, například k zavření všech datových proudů nebo souborů otevřených v try bloku.
  • Spravované výjimky v .NET jsou implementovány nad mechanismus strukturovaného zpracování výjimek Win32. Další informace najdete v tématu Strukturované zpracování výjimek (C/C++) a Kurz chybového ukončení v hloubkách 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 úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také