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á try
catch
finally
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éhocatch
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 vtry
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#.