Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое исключение?
Исключение (exception) в C# — это событие, которое возникает во время выполнения программы и нарушает нормальный поток инструкций. Это объект, содержащий информацию об ошибке или нештатной ситуации, которую программа не может обработать в текущем контексте. Механизм исключений позволяет отделить код, выполняющий основную логику, от кода обработки ошибок, что значительно улучшает читаемость и поддерживаемость программы.
Ключевые характеристики исключений
-
Наследование от System.Exception: Все исключения являются производными от базового класса
System.Exception. Например:System.NullReferenceException— обращение к объекту через null-ссылку.System.ArgumentException— недопустимый аргумент метода.System.IO.IOException— ошибки ввода-вывода.
-
Структура исключения:
- Message: Текстовое описание ошибки.
- StackTrace: Цепочка вызовов методов, приведшая к исключению.
- InnerException: Вложенное исключение (если есть).
- Source: Имя приложения или объекта, вызвавшего ошибку.
-
Генерация исключений: Исключения могут быть:
- Сгенерированы средой выполнения 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 выполнен.");
}
Классификация исключений
-
Системные исключения (SystemException):
- Производные от
System.SystemException. - Генерируются средой выполнения CLR.
- Примеры:
NullReferenceException,IndexOutOfRangeException,OutOfMemoryException.
- Производные от
-
Пользовательские исключения (ApplicationException):
- Хотя в .NET исторически использовалось наследование от
ApplicationException**, сейчас рекомендуется наследовать напрямую отException`. - Создаются разработчиком для описания специфичных ошибок предметной области.
- Хотя в .NET исторически использовалось наследование от
// Пример пользовательского исключения
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;
}
}
Принципы работы с исключениями
-
Не используйте исключения для управления потоком выполнения: Исключения — дорогостоящая операция (около 1000-4000 тактов процессора). Для проверки условий используйте условные конструкции.
-
Фильтры исключений (when): Позволяют уточнять условия перехвата исключений.
try
{
// Выполнение операции
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
// Обработка только 404 ошибки
}
-
Проброс исключений:
- Используйте
throw;для повторной генерации текущего исключения (сохраняет StackTrace). - Избегайте
throw ex;, так как это перезаписывает StackTrace.
- Используйте
-
Исключения в асинхронных методах: В async-методах исключения помещаются в возвращаемую задачу (
Task) и выбрасываются при ожидании (await).
Рекомендации по использованию
- Логируйте исключения, но не скрывайте их без веской причины.
- Создавайте информативные сообщения об ошибках, помогающие в отладке.
- Освобождайте ресурсы с помощью
usingили в блокеfinally. - Документируйте исключения, которые могут быть выброшены методом (с помощью XML-комментариев).
Механизм исключений в C# — это мощный инструмент для создания надежных и отказоустойчивых приложений. Правильное использование исключений позволяет не только корректно обрабатывать ошибки, но и проектировать систему с четким разделением ответственности и понятной логикой восстановления после сбоев.