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

Что такое Exception?

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

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

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

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

Что такое Exception в C#?

Исключение (Exception) в C# — это специальный объект, который инкапсулирует информацию об ошибке или аномальной ситуации, возникающей во время выполнения программы. Когда происходит ошибка (например, деление на ноль, обращение к null ссылке, отсутствие файла), среда выполнения .NET создаёт и "бросает" (throw) объект исключения. Если исключение не обрабатывается, программа завершается с ошибкой.

Ключевые аспекты исключений:

1. Иерархия классов исключений Все исключения наследуются от базового класса System.Exception. Основные производные классы:

  • SystemException — для ошибок среды выполнения (обычно не обрабатываются в коде).
  • ApplicationException — базовый класс для пользовательских исключений (используется редко).
  • Конкретные типы: NullReferenceException, DivideByZeroException, FileNotFoundException и др.

Пример иерархии:

// Базовый класс
Exception
├── SystemException
│   ├── ArgumentNullException
│   ├── InvalidOperationException
│   └── ...
├── ApplicationException
└── Пользовательские исключения

2. Механизм обработки исключений Для обработки используются блоки 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 выполнен");
}

3. Важные свойства класса Exception

  • Message — текстовое описание ошибки.
  • StackTrace — строковое представление стека вызовов в момент исключения.
  • InnerException — ссылка на вложенное исключение (при цепочке ошибок).
  • Source — имя приложения или объекта, вызвавшего ошибку.

4. Создание пользовательских исключений Рекомендуется наследоваться от Exception или его производных классов:

public class CustomValidationException : Exception
{
    public string FieldName { get; }
    
    public CustomValidationException(string message, string fieldName) 
        : base(message)
    {
        FieldName = fieldName;
    }
    
    // Переопределение ToString() для дополнительной информации
    public override string ToString()
    {
        return $"{base.ToString()}, Field: {FieldName}";
    }
}

// Использование
throw new CustomValidationException("Некорректное значение", "Email");

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

1. Используйте конкретные типы исключений Вместо перехвата общего Exception указывайте конкретные типы для точной обработки:

try
{
    File.ReadAllText("missing.txt");
}
catch (FileNotFoundException ex) // Конкретная обработка
{
    Console.WriteLine($"Файл не найден: {ex.FileName}");
}
catch (UnauthorizedAccessException ex) // Другая конкретная ошибка
{
    Console.WriteLine("Нет доступа к файлу");
}

2. Не злоупотребляйте исключениями для контроля потока Исключения — для ошибок, а не для обычной логики:

// ПЛОХО: использование исключений для проверки условия
try
{
    int value = GetValueFromDictionary(key);
}
catch (KeyNotFoundException)
{
    // Логика для отсутствующего ключа
}

// ХОРОШО: проверка перед использованием
if (dictionary.ContainsKey(key))
{
    int value = dictionary[key];
}
else
{
    // Логика для отсутствующего ключа
}

3. Правильно используйте блок finally Гарантированное освобождение ресурсов:

FileStream fileStream = null;
try
{
    fileStream = new FileStream("file.txt", FileMode.Open);
    // Работа с файлом
}
catch (IOException ex)
{
    Console.WriteLine($"Ошибка ввода-вывода: {ex.Message}");
}
finally
{
    fileStream?.Close(); // Всегда закрываем файл
}

4. Используйте using для автоматического управления ресурсами Для классов, реализующих IDisposable:

using (var fileStream = new FileStream("file.txt", FileMode.Open))
using (var reader = new StreamReader(fileStream))
{
    // Ресурсы автоматически освободятся при выходе из блока
    // даже при возникновении исключения
}

Важность исключений:

  1. Отделение нормальной логики от обработки ошибок — код становится чище и понятнее.
  2. Поток выполнения — исключения могут передаваться вверх по стеку вызовов до нахождения подходящего обработчика.
  3. Информативность — объект исключения содержит детали ошибки для диагностики.
  4. Безопасность — предотвращение аварийного завершения программы.

Исключения — фундаментальный механизм обработки ошибок в C#, который при правильном использовании значительно повышает надёжность и поддерживаемость кода. Ключ к эффективной работе с ними — понимание их природы, использование конкретных типов исключений и соблюдение лучших практик .NET.