Перейти к содержимому
На этой странице

Обработка ошибок

Все темы C++ Developer

Какие конструкции используют при обработке exception?

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

  1. try:

    • Блок кода, в котором могут возникнуть исключения.
    try {
        // Код, который может вызвать исключение
    }
  2. catch:

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

    • Перехватывает и обрабатывает исключения, выброшенные в блоке try.

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

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

Как отловить деление на 0 в С++?

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

Пример:
#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;
}

Можно ли выбрасывать exception с деструктора?

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

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

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

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

Собеседования: C++

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: C++-разработчик, Разработчик системного ПО. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.