Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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é slovocatch
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 slovathrow
na konci blokucatch
. -
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 vtry
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#.