Sobes.tech
Intern

Kas yra išimtys C# programavimo kalboje?

sobes.tech AI

Atsakymas iš AI

C# išskirtiniai atvejai yra nenormalios situacijos arba klaidos, kurios įvyksta programos vykdymo metu ir trikdo jos įprastą srautą.

Jos leidžia atskirti klaidų apdorojimo kodą nuo pagrindinio programos logikos kodo ir užtikrina struktūruotesnį klaidų valdymo požiūrį.

Pagrindiniai C# išskirtinių atvejų aspektai:

  1. Tipai: C# turi standartinių išskirtinių klasių hierarchiją, paveldinčią iš bazinės System.Exception klasės. Pavyzdžiui, System.NullReferenceException, System.DivideByZeroException, System.IO.FileNotFoundException. Taip pat galima kurti savo išskirtinių klasių.
  2. Išskirtinių atvejų generavimas (throw): Išskirtinis atvejis generuojamas naudojant raktinę žodį throw.
  3. Išskirtinių atvejų gaudymas (try-catch): try blokas apima kodą, kuris gali sukelti išskirtinį atvejį. catch blokas gaudo nurodytą išskirtinio atvejo tipą ir vykdo jo apdorojimo kodą.
  4. Galutinis blokas (finally): finally blokas visada vykdomas, nepriklausomai nuo to, ar įvyko išskirtinis atvejis ar ne. Dažnai naudojamas išteklių išlaisvinimui.
  5. Naudojant using operatorių: Patogesnis būdas valdyti išteklius, kuris garantuoja Dispose metodo iškvietimą. Tai panašu į try-finally struktūrą objektams, įgyvendinantiems IDisposable sąsają.
  6. Išskirtinių atvejų filtrai: Leidžia pridėti sąlygą prie catch bloko, siekiant specifinio išskirtinių atvejų apdorojimo.

Pavyzdys naudojimo:

public class Example
{
    public void ProcessData(int denominator)
    {
        try
        {
            int result = 10 / denominator; // Gali sukelti `DivideByZeroException`
            Console.WriteLine($"Rezultatas: {result}");
        }
        catch (DivideByZeroException ex) // Gaudo konkretų išskirtinį atvejį
        {
            Console.WriteLine("Klaida: negalima dalinti iš nulio.");
            // Klaidos registravimas, jei reikia
            // Console.WriteLine($"Išskirtinio atvejo detalės: {ex.Message}");
        }
        catch (Exception ex) // Gaudo bet kokį kitą išskirtinį atvejį
        {
            Console.WriteLine($"Nenumatyta klaida: {ex.Message}");
        }
        finally // Šis blokas visada vykdomas
        {
            Console.WriteLine("Apdorojimas baigtas.");
        }
    }

    public void UsingExample()
    {
        // Pavyzdys naudojant `using` automatiškai iškvietus `Dispose`
        using (StreamReader reader = new StreamReader("file.txt"))
        {
            string line = reader.ReadLine();
            Console.WriteLine(line);
        } // Čia `reader.Dispose()` iškviečiama automatiškai, net jei įvyksta išskirtinis atvejis
    }

    public void ThrowExample(int value)
    {
        if (value < 0)
        {
            throw new ArgumentOutOfRangeException(nameof(value), "Reikšmė turi būti neigiama."); // Savo išskirtinio atvejo generavimas
        }
        // ... tolimesnė logika
    }
}