Lekce 12: Výjimky a práce s chybami v C# – Efektivní zpracování chybových stavů

V každé aplikaci může dojít k situacím, kdy se něco pokazí. Výjimky jsou mechanismus, který umožňuje efektivní zpracování chyb a neočekávaných situací během běhu programu. V jazyce C# poskytuje práce s výjimkami robustní způsob, jak zvládat chyby, aniž by došlo k pádu aplikace. V této lekci se naučíme základní pojmy výjimek, jak je vyvolávat, zpracovávat, a jak používat bloky try, catch, finally, a vlastní výjimky.
1. Co je výjimka?
Výjimka je speciální událost nebo objekt, který signalizuje výskyt chyby nebo jiné neobvyklé situace během běhu programu. Pokud dojde k výjimce, běžné provádění kódu se zastaví a řízení přejde do nejbližšího bloku pro zpracování výjimky.
Typické příklady výjimek:
- Pokus o dělení nulou (
DivideByZeroException
) - Přístup k neexistujícímu prvku v poli (
IndexOutOfRangeException
) - Chyby při práci se soubory, jako je chybějící soubor (
FileNotFoundException
)
2. Blok try-catch
Blok try-catch je základní mechanismus pro zpracování výjimek. Kód, který může způsobit výjimku, je uzavřen do bloku try, a chyby se zpracovávají v jednom nebo více blocích catch.
Syntaxe:
try
{
// Kód, který může způsobit výjimku
}
catch (TypVýjimky e)
{
// Zpracování výjimky
}
Příklad:
try
{
int delitel = 0;
int vysledek = 10 / delitel; // Vyvolá DivideByZeroException
}
catch (DivideByZeroException e)
{
Console.WriteLine("Chyba: Nelze dělit nulou.");
}
3. Blok finally
Blok finally se používá pro kód, který musí být proveden bez ohledu na to, zda došlo k výjimce nebo ne. Typicky se využívá pro uvolnění zdrojů, uzavření souborů nebo databázových spojení.
Syntaxe:
try
{
// Kód, který může způsobit výjimku
}
catch (Exception e)
{
Console.WriteLine("Došlo k chybě.");
}
finally
{
Console.WriteLine("Tento kód se provede vždy.");
}
Příklad:
try
{
int[] pole = { 1, 2, 3 };
Console.WriteLine(pole[5]); // Vyvolá IndexOutOfRangeException
}
catch (IndexOutOfRangeException e)
{
Console.WriteLine("Chyba: Přístup mimo rozsah pole.");
}
finally
{
Console.WriteLine("Konec zpracování.");
}
4. Vlastní výjimky
Můžeme vytvářet vlastní typy výjimek pro specifické potřeby aplikace. Tyto výjimky se vytvářejí děděním od třídy Exception.
Příklad:
public class MojeVyjimka : Exception
{
public MojeVyjimka(string zprava) : base(zprava)
{
}
}
Použití vlastní výjimky:
try
{
throw new MojeVyjimka("Došlo k vlastní výjimce.");
}
catch (MojeVyjimka e)
{
Console.WriteLine($"Zachycena vlastní výjimka: {e.Message}");
}
5. Klíčová slova throw a re-throw
Klíčové slovo throw se používá k vyvolání výjimky. Pomocí něj můžeme také předat výjimku dál po zpracování.
Příklad vyvolání výjimky:
throw new ArgumentException("Špatný argument.");
Příklad předání výjimky:
try
{
throw new InvalidOperationException("Chyba operace.");
}
catch (InvalidOperationException e)
{
Console.WriteLine("Výjimka zpracována.");
throw; // Předání výjimky dál
}
6. Výhody a správné použití výjimek
- Oddělení běžného a chybového toku kódu: Výjimky umožňují snadné rozdělení běžného toku kódu od chybového zpracování.
- Zachytávání specifických chyb: Pomocí různých typů výjimek můžeme přesně zachytit a zpracovat konkrétní chyby.
- Zvyšování čitelnosti kódu: Použití výjimek činí kód srozumitelnějším a lépe udržovatelným.
Správná praxe:
- Používejte výjimky pouze pro skutečné chyby, ne pro běžnou logiku programu.
- Nikdy nezachytávejte obecnou výjimku Exception, pokud to není nutné.
- Vždy uvolňujte zdroje (např. soubory, databázová připojení) v bloku finally nebo pomocí konstrukce using.
7. Příklad komplexního zpracování výjimek
Tento příklad ukazuje, jak kombinovat různé typy bloků pro robustní zpracování výjimek:
try
{
Console.WriteLine("Zadejte číslo:");
int cislo = int.Parse(Console.ReadLine());
Console.WriteLine($"Zadané číslo: {cislo}");
}
catch (FormatException e)
{
Console.WriteLine("Chyba: Zadaná hodnota není číslo.");
}
catch (OverflowException e)
{
Console.WriteLine("Chyba: Číslo je příliš velké nebo malé.");
}
finally
{
Console.WriteLine("Děkujeme za použití aplikace.");
}
Závěr
Zpracování výjimek je zásadní součástí robustních a spolehlivých aplikací. C# poskytuje výkonné nástroje pro práci s výjimkami, včetně bloků try-catch-finally, možnosti vytvářet vlastní výjimky a použití klíčového slova throw. Správné používání výjimek zvyšuje čitelnost a udržovatelnost kódu a pomáhá vývojářům lépe zvládat neočekávané situace.