====== Zpracování výjimek v .NET ====== Výjimka (Exception) je objekt, který nese informaci o chybě, k níž došlo během vykonávání programu. Proces zachycení a zpracování této chyby se nazývá **Exception Handling**. ===== 1. Základní konstrukce: try-catch-finally ===== Pro práci s výjimkami používá .NET čtyři základní klíčová slova: * **try:** Blok kódu, ve kterém očekáváme, že by mohlo dojít k chybě. * **catch:** Blok, který se vykoná pouze v případě, že v sekci ''try'' nastane výjimka. Zde se provádí logování nebo náprava chyby. * **finally:** Blok, který se vykoná **vždy**, bez ohledu na to, zda výjimka nastala či nikoliv. Ideální pro uvolňování zdrojů (pokud nepoužíváme [[it:sw:idisp_using|blok using]]). * **throw:** Slouží k ručnímu vyvolání výjimky. try { int vysledek = 10 / nula; // Zde vznikne DivideByZeroException } catch (DivideByZeroException ex) { Console.WriteLine("Nelze dělit nulou!"); } catch (Exception ex) { Console.WriteLine($"Nastala obecná chyba: {ex.Message}"); } finally { Console.WriteLine("Operace ukončena."); } ---- ===== 2. Hierarchie výjimek ===== V .NET všechny výjimky dědí ze základní třídy **System.Exception**. Při odchytávání je důležité řadit bloky ''catch'' od **nejspecifičtějších po nejobecnější**. * **SystemException:** Chyby generované runtimem (např. `NullReferenceException`, `StackOverflowException`). * **ApplicationException:** Dříve doporučovaný základ pro vlastní výjimky (dnes se doporučuje dědit přímo z `Exception`). ---- ===== 3. Propagace výjimek a Stack Trace ===== Pokud výjimka není zachycena v aktuální metodě, "probublává" nahoru do volající metody. Tento proces pokračuje, dokud není nalezena odpovídající sekce ''catch'', nebo dokud aplikace nespadne. Objekt výjimky obsahuje vlastnost **StackTrace**, což je textový výpis cesty, kterou výjimka prošla. To je klíčové pro debugging. > **Pozor:** Při opětovném vyhazování výjimky v bloku catch používejte samotné `throw;`. Pokud použijete `throw ex;`, přepíšete původní StackTrace a ztratíte informaci o tom, kde chyba skutečně vznikla. ---- ===== 4. Filtry výjimek (Exception Filters) ===== Od verze C# 6.0 lze použít klíčové slovo `when`, které umožní zachytit výjimku jen za určité podmínky: catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { Console.WriteLine("Stránka nebyla nalezena."); } ---- ===== 5. Best Practices ===== * **Nechytejte všechno:** Nepoužívejte prázdný `catch (Exception) {}` (tzv. "swallowing exceptions"). Chyby by neměly být ignorovány. * **Vlastní výjimky:** Vytvářejte si vlastní třídy výjimek pro specifické doménové chyby (např. `InsufficientFundsException`). * **Předcházejte výjimkám:** Pokud můžete chybě předejít podmínkou (např. `if (obj != null)`), je to výkonově mnohem lepší než nechat vyvolat `NullReferenceException`. ---- //Související články:// * [[it:sw:idisp_using|Rozhraní IDisposable a blok using]] * [[it:sw:unit_testing|Unit Testing (testování chybových stavů)]] * [[it:sw:garbage_collector|Garbage Collector a správa paměti]] //Tagy: {{tag>programming dot-net csharp exception-handling error-management clean-code}}//