C#:
Обработка ошибок

Как это сделать:

Начнем с блока try-catch. Это как поставить сеть безопасности под канатоходца. Если он поскользнется, он не упадет вниз — его поймают.

using System;

class ПримерОбработкиОшибок {
    static void Main() {
        try {
            int[] числа = {1, 2, 3};
            Console.WriteLine(числа[5]);  // Ой, индекс вне границ!
        } catch (IndexOutOfRangeException e) {
            Console.WriteLine("Ошибка перехвачена: " + e.Message);
        }
    }
}

Пример вывода при возникновении ошибок:

Ошибка перехвачена: Индекс находился вне границ массива.

Теперь добавим блок finally — это то, что происходит в любом случае, как и платежи налогов.

try {
    // Потенциально проблемный код здесь
} catch (SomeSpecificException e) {
    // Обработка этой конкретной ошибки здесь
} finally {
    // Этот код выполняется независимо от того, что произошло выше
    Console.WriteLine("Это всегда выполняется.");
}

Глубокое погружение

Обработка ошибок была в C# с момента его создания. Со временем она эволюционировала. В прошлом программисты полагались на возвращаемые коды или глобальные флаги для сигнализации о проблемах — громоздко и склонно к ошибкам.

C# использует исключения, более современный подход. Исключение генерируется, когда происходит что-то неожиданное, подобно поднятию флага на игре в американский футбол. Структурированная обработка исключений с блоками try, catch и finally делает управление этими моментами более ясным и чистым, чем старые методы проверки ошибок.

Альтернативы? Конечно. Есть UnhandledExceptionEventHandler для исключений, которые прошли мимо. Или в асинхронном коде, обработка ошибок делается немного по-другому с объектами Task, которые несут собственный груз исключений.

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

См. также