Sobes.tech
Intern

Какво са изключенията в езика за програмиране C#?

sobes.tech AI

Отговор от AI

Изключенията в C# са аномални ситуации или грешки, които възникват по време на изпълнение на програмата и нарушават нейния нормален поток.

Те позволяват да се отдели кодът за обработка на грешки от основния логически код на приложението и осигуряват по-структуриран подход към управлението на грешките.

Основните аспекти на изключенията в C#:

  1. Типове изключения: C# разполага с йерархия от стандартни класове за изключения, наследяващи се от базовия клас System.Exception. Например, System.NullReferenceException, System.DivideByZeroException, System.IO.FileNotFoundException. Могат да се създават и собствени класове за изключения.
  2. Генериране на изключения (throw): Изключение се генерира с помощта на ключовата дума throw.
  3. Обработка на изключения (try-catch): Блокът try съдържа код, който може да генерира изключение. Блокът catch улавя определен тип изключение и изпълнява кода за неговата обработка.
  4. Завършващ блок (finally): Блокът finally винаги се изпълнява, независимо дали е възникнало изключение или не. Често се използва за освобождаване на ресурси.
  5. Оператор using: По-удобен начин за управление на ресурсите, който гарантира извикването на метода Dispose. Той е аналогичен на конструкцията try-finally за обекти, реализиращи интерфейса IDisposable.
  6. Филтри за изключения: Позволяват да се добави условие към блока catch за по-специфична обработка на изключения.

Пример за използване:

public class Example
{
    public void ProcessData(int denominator)
    {
        try
        {
            int result = 10 / denominator; // Може да генерира DivideByZeroException
            Console.WriteLine($"Резултат: {result}");
        }
        catch (DivideByZeroException ex) // Улавя конкретно изключение
        {
            Console.WriteLine("Грешка: не може да се дели на нула.");
            // Логиране на изключението, ако е необходимо
            // Console.WriteLine($"Детайли за изключението: {ex.Message}");
        }
        catch (Exception ex) // Улавя всяко друго изключение
        {
            Console.WriteLine($"Настъпи неочаквана грешка: {ex.Message}");
        }
        finally // Този блок винаги ще се изпълни
        {
            Console.WriteLine("Обработката е завършена.");
        }
    }

    public void UsingExample()
    {
        // Пример за използване на using за автоматично извикване на Dispose
        using (StreamReader reader = new StreamReader("file.txt"))
        {
            string line = reader.ReadLine();
            Console.WriteLine(line);
        } // Тук reader.Dispose() се извиква автоматично, дори ако възникне изключение
    }

    public void ThrowExample(int value)
    {
        if (value < 0)
        {
            throw new ArgumentOutOfRangeException(nameof(value), "Стойността трябва да е неотрицателна."); // Генериране на собствено изключение
        }
        // ... допълнителна логика
    }
}