Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

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

Все темы 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 (...) {
            // Обработка исключения, например, логирование
        }
    }
};

Эта страница была полезной?