C#:
Обробка помилок

Як це зробити:

Почнемо з блоку try-catch. Це ніби ставлення захисної сітки під стропила. Якщо вони послизнуться, вони не падають вниз – їх ловлять.

using System;

class ErrorHandlingExample {
    static void Main() {
        try {
            int[] numbers = {1, 2, 3};
            Console.WriteLine(numbers[5]);  // Ой Лишенько, індекс за межами!
        } catch (IndexOutOfRangeException e) {
            Console.WriteLine("Помилка вловлена: " + e.Message);
        }
    }
}

Приклад виводу, коли щось пішло не так:

Помилка вловлена: Індекс знаходився за межами масиву.

Тепер ми додаємо блок finally – це те, що відбувається в будь-якому випадку, як сплата податків.

try {
    // Потенційно проблемний код тут
} catch (SomeSpecificException e) {
    // Обробка цієї конкретної помилки тут
} finally {
    // Цей код виконується незалежно від того, що відбувається вище
    Console.WriteLine("Це завжди виконується.");
}

Глибоке занурення

Обробка помилок була у C# з самого його створення. З часом вона еволюціонувала. Колись програмісти покладалися на коди повернення або глобальні прапорці для сигналізації про проблеми – це було громіздко і схильно до помилок.

C# використовує виключення (exceptions), більш сучасний підхід. Виключення генерується, коли стається щось несподіване, точно так само, як кидають прапорець на поле під час футбольного матчу. Структуроване управління виключеннями із блоками try, catch і finally робить процес управління цими моментами яснішим та чистішим, ніж методи перевірки помилок старої школи.

Є альтернативи? Звісно. Є UnhandledExceptionEventHandler для виключень, що прослизнули повз. Або у асинхронному коді, обробка помилок стає дещо іншою за допомогою об’єктів Task, які несуть у собі власне вантаж виключень.

Деталі реалізації – подібні до дрібного шрифту – мають значення. Виключення можуть бути дороговартісними, знижуючи продуктивність, якщо генеруватись без розбору. Тому ми використовуємо їх для виняткових випадків, а не для щоденного контролю логіки.

Дивіться також