Sobes.tech
Intern

Co jsou výjimky v jazyce C#?

sobes.tech AI

Odpověď od AI

Výjimky v C# jsou abnormální situace nebo chyby, které nastávají během běhu programu a narušují jeho normální tok.

Umožňují oddělit kód pro zpracování chyb od hlavního kódu logiky aplikace a poskytují strukturovanější přístup k řízení chyb.

Hlavní aspekty výjimek v C#:

  1. Typy výjimek: C# má hierarchii standardních tříd výjimek, které dědí od základní třídy System.Exception. Například System.NullReferenceException, System.DivideByZeroException, System.IO.FileNotFoundException. Je možné vytvářet i vlastní třídy výjimek.
  2. Generování výjimek (throw): Výjimka je generována pomocí klíčového slova throw.
  3. Zachycení výjimek (try-catch): Blok try obsahuje kód, který může generovat výjimku. Blok catch zachytí specifický typ výjimky a provede kód pro její zpracování.
  4. Závěrečný blok (finally): Blok finally se vždy provede, ať už došlo k výjimce nebo ne. Často se používá k uvolnění zdrojů.
  5. Operátor using: Pohodlnější způsob správy zdrojů, který zaručuje volání metody Dispose. Je analogický konstrukci try-finally pro objekty implementující rozhraní IDisposable.
  6. Filtry výjimek: Umožňují přidat podmínku k bloku catch pro specifičtější zpracování výjimek.

Příklad použití:

public class Example
{
    public void ProcessData(int denominator)
    {
        try
        {
            int result = 10 / denominator; // Může generovat DivideByZeroException
            Console.WriteLine($"Výsledek: {result}");
        }
        catch (DivideByZeroException ex) // Zachytává konkrétní výjimku
        {
            Console.WriteLine("Chyba: nelze dělit nulou.");
            // Logování výjimky, pokud je potřeba
            // Console.WriteLine($"Detaily výjimky: {ex.Message}");
        }
        catch (Exception ex) // Zachytává jakoukoli jinou výjimku
        {
            Console.WriteLine($"Nastala neočekávaná chyba: {ex.Message}");
        }
        finally // Tento blok se vždy provede
        {
            Console.WriteLine("Zpracování dokončeno.");
        }
    }

    public void UsingExample()
    {
        // Příklad použití `using` pro automatické volání Dispose
        using (StreamReader reader = new StreamReader("file.txt"))
        {
            string line = reader.ReadLine();
            Console.WriteLine(line);
        } // Zde je volání reader.Dispose() automatické, i když dojde k výjimce
    }

    public void ThrowExample(int value)
    {
        if (value < 0)
        {
            throw new ArgumentOutOfRangeException(nameof(value), "Hodnota musí být nezáporná."); // Generování vlastní výjimky
        }
        // ... další logika
    }
}