← Назад к вопросам

Что такое исключение?

1.0 Junior🔥 181 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое исключение?

Исключение (exception) в C# — это событие, которое возникает во время выполнения программы и нарушает нормальный поток инструкций. Это объект, содержащий информацию об ошибке или нештатной ситуации, которую программа не может обработать в текущем контексте. Механизм исключений позволяет отделить код, выполняющий основную логику, от кода обработки ошибок, что значительно улучшает читаемость и поддерживаемость программы.

Ключевые характеристики исключений

  1. Наследование от System.Exception: Все исключения являются производными от базового класса System.Exception. Например:

    • System.NullReferenceException — обращение к объекту через null-ссылку.
    • System.ArgumentException — недопустимый аргумент метода.
    • System.IO.IOException — ошибки ввода-вывода.
  2. Структура исключения:

    • Message: Текстовое описание ошибки.
    • StackTrace: Цепочка вызовов методов, приведшая к исключению.
    • InnerException: Вложенное исключение (если есть).
    • Source: Имя приложения или объекта, вызвавшего ошибку.
  3. Генерация исключений: Исключения могут быть:

    • Сгенерированы средой выполнения CLR (например, при делении на ноль).
    • Созданы явно разработчиком с помощью ключевого слова throw.
// Пример явной генерации исключения
public void SetAge(int age)
{
    if (age < 0 || age > 150)
    {
        throw new ArgumentOutOfRangeException(nameof(age), "Age must be between 0 and 150.");
    }
    this.Age = age;
}

Обработка исключений: конструкция try-catch-finally

Основной механизм обработки исключений строится вокруг блоков try, catch и finally:

try
{
    // Код, который может вызвать исключение
    int result = Divide(10, 0);
}
catch (DivideByZeroException ex)
{
    // Обработка конкретного типа исключения
    Console.WriteLine($"Деление на ноль: {ex.Message}");
}
catch (Exception ex)
{
    // Общий обработчик (должен быть последним)
    Console.WriteLine($"Общая ошибка: {ex.Message}");
}
finally
{
    // Код, выполняемый всегда (например, освобождение ресурсов)
    Console.WriteLine("Блок finally выполнен.");
}

Классификация исключений

  1. Системные исключения (SystemException):

    • Производные от System.SystemException.
    • Генерируются средой выполнения CLR.
    • Примеры: NullReferenceException, IndexOutOfRangeException, OutOfMemoryException.
  2. Пользовательские исключения (ApplicationException):

    • Хотя в .NET исторически использовалось наследование от ApplicationException**, сейчас рекомендуется наследовать напрямую от Exception`.
    • Создаются разработчиком для описания специфичных ошибок предметной области.
// Пример пользовательского исключения
public class InsufficientFundsException : Exception
{
    public decimal CurrentBalance { get; }
    public decimal RequiredAmount { get; }
    
    public InsufficientFundsException(decimal currentBalance, decimal requiredAmount)
        : base($"Недостаточно средств. Текущий баланс: {currentBalance}, требуется: {requiredAmount}")
    {
        CurrentBalance = currentBalance;
        RequiredAmount = requiredAmount;
    }
}

Принципы работы с исключениями

  1. Не используйте исключения для управления потоком выполнения: Исключения — дорогостоящая операция (около 1000-4000 тактов процессора). Для проверки условий используйте условные конструкции.

  2. Фильтры исключений (when): Позволяют уточнять условия перехвата исключений.

try
{
    // Выполнение операции
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
    // Обработка только 404 ошибки
}
  1. Проброс исключений:

    • Используйте throw; для повторной генерации текущего исключения (сохраняет StackTrace).
    • Избегайте throw ex;, так как это перезаписывает StackTrace.
  2. Исключения в асинхронных методах: В async-методах исключения помещаются в возвращаемую задачу (Task) и выбрасываются при ожидании (await).

Рекомендации по использованию

  • Логируйте исключения, но не скрывайте их без веской причины.
  • Создавайте информативные сообщения об ошибках, помогающие в отладке.
  • Освобождайте ресурсы с помощью using или в блоке finally.
  • Документируйте исключения, которые могут быть выброшены методом (с помощью XML-комментариев).

Механизм исключений в C# — это мощный инструмент для создания надежных и отказоустойчивых приложений. Правильное использование исключений позволяет не только корректно обрабатывать ошибки, но и проектировать систему с четким разделением ответственности и понятной логикой восстановления после сбоев.

Что такое исключение? | PrepBro