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

Что такое Exception?

1.0 Junior🔥 161 комментариев
#Автоматизация тестирования

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

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

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

Что такое Exception (Исключение)?

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

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

  1. Нарушение нормального потока выполнения: Без механизма исключений программа бы аварийно завершалась при каждой ошибке. Исключения позволяют "перехватить" эту ситуацию и решить, как поступить дальше.

  2. Объектно-ориентированная природа: В языках вроде Java, C#, Python исключение — это полноценный объект класса, унаследованного от базового класса Exception (или аналогичного).

  3. Иерархия типов: Исключения обычно организованы в иерархию. Например, есть общий класс Exception, а более конкретные типы, такие как NullPointerException, IOException, ArrayIndexOutOfBoundsException, являются его наследниками.

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

  • Выброс исключения (Throw): Когда возникает проблема, метод создает и "выбрасывает" объект исключения с помощью ключевого слова throw (в Java/C#) или raise (в Python).

    // Пример на Java
    public void withdraw(int amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException("Запрашиваемая сумма превышает баланс");
        }
        // ... логика списания
    }
    
  • Обработка исключения (Catch): Код, который может вызвать исключение, помещается в специальный блок try. Блок catch предназначен для "перехвата" и обработки определенного типа исключений.

    # Пример на Python
    try:
        file = open("config.txt", "r")
        data = file.read()
        number = int(data)
    except FileNotFoundError:
        print("Файл не найден, используется значение по умолчанию")
        number = 10
    except ValueError as e:
        print(f"Ошибка преобразования данных: {e}")
        number = 0
    finally:
        print("Эта секция выполнится в любом случае")
        if 'file' in locals():
            file.close()
    
  • Распространение исключения (Propagation): Если исключение не обработано в текущем методе, оно передается (пробрасывается) вверх по стеку вызовов, в вызывающий метод, и так далее, пока не будет найден подходящий обработчик catch. Если обработчик так и не найден, программа завершится с ошибкой (крашем).

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

Обычно исключения делят на две большие категории:

  • Проверяемые исключения (Checked Exceptions): Это исключения, которые компилятор обязывает либо обработать в блоке try-catch, либо объявить в сигнатуре метода (с помощью throws в Java). Они обычно указывают на внешние проблемы, которые программист может предвидеть (например, IOException при работе с файлами).

    // Компилятор потребует обработать это исключение
    public void readFile() {
        try {
            Files.readAllLines(Paths.get("file.txt"));
        } catch (IOException e) {
            // Обработка
        }
    }
    
  • Непроверяемые исключения (Unchecked Exceptions): К ним относятся RuntimeException и его наследники (например, NullPointerException, ArithmeticException). Компилятор не проверяет их наличие. Они часто свидетельствуют о логических ошибках в коде программиста (обращение к null, деление на ноль, выход за границы массива).

  • Ошибки (Errors): Это более серьезные проблемы, которые обычно не обрабатываются в прикладном коде (например, OutOfMemoryError, StackOverflowError). Они указывают на сбои в среде выполнения (JVM).

Почему исключения важны для QA-инженера?

  1. Анализ логов и крашей: Понимание типа исключения (NullPointerException) и его стека вызовов — это первый и главный шаг при расследовании дефекта. Это позволяет точно локализовать место сбоя в коде.

  2. Написание тестов: При проектировании тестов необходимо покрывать как позитивные сценарии (когда исключения не возникают), так и негативные (когда они должны возникать).

    *   **Проверка выбрасывания исключений:** В тестах можно и нужно проверять, что при определенных некорректных входных данных метод действительно выбрасывает ожидаемое исключение.
    ```java
    // Пример теста на JUnit
    @Test
    void withdraw_shouldThrowException_whenBalanceIsInsufficient() {
        Account account = new Account(100);
        InsufficientFundsException exception = assertThrows(
            InsufficientFundsException.class,
            () -> account.withdraw(200)
        );
        assertEquals("Запрашиваемая сумма превышает баланс", exception.getMessage());
    }
    ```
    *   **Валидация обработки исключений:** Нужно проверять, что приложение корректно обрабатывает исключения — не крашится, а показывает понятное пользователю сообщение, логирует ошибку, освобождает ресурсы.

  1. Понимание логики приложения: Знание того, какие исключения и где могут возникнуть, помогает QA лучше понимать архитектуру и слабые места системы, что способствует более эффективному тест-дизайну.

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

Что такое Exception? | PrepBro