---
title: Обработка ошибок
seo:
  title: Обработка ошибок — C++ Developer
  description: Тема «Обработка ошибок» для собеседования C++ Developer. Какие конструкции используют при обработке exception? Как отловить деление на 0 в С++?
---

[Все темы C++ Developer](/c-developer)

## <strong>Какие конструкции используют при обработке</strong> <code>exception</code><strong>?</strong> [#q-14bee738d69b8148ab71c2022eeb5be5]

При обработке исключений в C++ используются следующие конструкции&#58;

{/* prettier-ignore */}
1. <code>try</code>&#58;

    - Блок кода, в котором могут возникнуть исключения.

    ```cpp
    try {
        // Код, который может вызвать исключение
    }
    ```

1. <code>catch</code>&#58;

    - Блок кода для обработки исключений.

    - Перехватывает и обрабатывает исключения, выброшенные в блоке <code>try</code>.

    ```cpp
    catch (const std::exception& e) {
        // Обработка исключения
    }
    ```

1. <code>throw</code>&#58;

    - Оператор для генерации исключения.

    ```cpp
    throw std::runtime_error("Ошибка");
    ```

<strong>Пример&#58;</strong>

```cpp
try {
    // Код, который может вызвать исключение
    throw std::runtime_error("Ошибка");
} catch (const std::exception& e) {
    // Обработка исключения
    std::cout << "Исключение: " << e.what() << std::endl;
}
```

:::note[Ссылки для изучения]

1. [Обработка исключений в C++](https://metanit.com/cpp/tutorial/6.1.php)
   :::

---

## <strong>Как отловить деление на 0 в С++?</strong> [#q-14bee738d69b81a194cde6b6ca5f4c81]

Для отлова деления на 0 в C++ можно использовать обработку исключений с конструкциями <code>try</code>, <code>catch</code>, и выбросом исключения <code>throw</code>. Поскольку стандартное деление на ноль для целых чисел не генерирует исключение, нужно явно проверять делитель и выбрасывать исключение при делении на 0.

<strong>Пример&#58;</strong>

```cpp
#include <iostream>
#include <stdexcept>

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Деление на ноль!");
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0);
        std::cout << "Результат: " << result << std::endl;
    } catch (const std::exception& e) {
        std::cout << "Ошибка: " << e.what() << std::endl;
    }
    return 0;
}
```

:::note[Ссылки для изучения]

1. [Обработка исключений в C++](https://metanit.com/cpp/tutorial/6.1.php)
   :::

---

## <strong>Можно ли выбрасывать</strong> <code>exception</code> <strong>с деструктора?</strong> [#q-14bee738d69b81b7858aecc2400de398]

Исключение может возникнуть внутри деструктора, но обычно его следует обработать там же. Если оно выходит из noexcept-деструктора, вызывается std&#58;&#58;terminate. Если деструктор выпускает исключение во время раскрутки стека из-за другого исключения, также вызывается std&#58;&#58;terminate. Это определённое стандартом завершение, а не неопределённое поведение.

<strong>Правильный подход&#58;</strong>

1. Обрабатывать все возможные исключения внутри деструктора и не позволять им выходить за его пределы.

1. Если требуется сообщить об ошибке, использовать другие механизмы, такие как логирование или флаги ошибок.

<strong>Пример&#58;</strong>

```cpp
class MyClass {
public:
    ~MyClass() {
        try {
            // Код, который может вызвать исключение
        } catch (...) {
            // Обработка исключения, например, логирование
        }
    }
};
```

:::note[Ссылки для изучения]

1. [Обработка исключений в C++](https://metanit.com/cpp/tutorial/6.1.php)
   :::
