Стандартная библиотека C++<exception>

В программировании на C++ обработка исключений — важный механизм обработки ошибок, который позволяет программе корректно обрабатывать ошибки вместо аварийного завершения.

В C++ обработка исключений обычно реализуется с помощью ключевых слов try, catch и throw. Стандартная библиотека предоставляет класс std::exception и его производные классы для обработки исключений.

В стандартной библиотеке C++,<exception>Заголовочный файл предоставляет набор инфраструктуры обработки исключений, включая классы исключений, механизмы обработки исключений и т. д.

Исключение — это событие, возникающее во время выполнения программы, которое прерывает нормальный поток инструкций. В C++ исключением может быть объект любого типа, но обычно это объект класса исключения. Стандартная библиотека C++ определяет некоторые базовые классы исключений, такие какstd::exception、std::bad_alloc、std::bad_castи т. д.

Вы можете расширить функциональность обработки исключений, определив собственные классы исключений, или использовать существующие классы исключений из стандартной библиотеки для обработки типичных сценариев исключений.

Синтаксис

Выбросить исключение

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

throw exception_object;

Перехват исключений

Используйте ключевые слова try и catch для перехвата и обработки исключений, синтаксис следующий:

try {
    // 可能抛出异常的代码
} catch (exception_type e) {
    // 处理异常的代码
}

Вы можете указать тип исключения для перехвата или использовать общий блок catch для перехвата всех типов исключений:

try {
    // 可能会抛出异常的代码
} catch (const std::exception& e) {
    // 处理 std::exception 及其派生类的异常
} catch (...) {
    // 处理所有其他类型的异常
}

std::exception

std::exception — это базовый класс, определённый в стандартной библиотеке C++ и служащий основой для всех стандартных классов исключений. Он определяет виртуальные функции, такие как what(), которые возвращают строку в стиле C с описанием информации об исключении.

class exception {
public:
    virtual const char* what() const noexcept;
};

Стандартные классы исключений

Стандартная библиотека C++ предоставляет несколько классов исключений, производных от std::exception, таких как std::runtime_error, std::logic_error и т. д., для представления типичных сценариев исключений. Вы можете выбрать подходящий класс в зависимости от конкретной ситуации с исключением.

throw std::runtime_error("Runtime error occurred");
throw std::logic_error("Logic error occurred");

Пример

Ниже показано использование<exception>Простой пример заголовочного файла, демонстрирующий, как выбрасывать и перехватывать исключения.

Пример

#include <iostream>
#include <exception>

class MyException : public std::exception {
public:
    const char* what() const throw() {
        return "My custom exception";
    }
};

int main() {
    try {
        // имитировать условие ошибки
        bool error_condition = true;
        if (error_condition) {
            throw MyException();
        }
    } catch (const std::exception& e) {
        std::cout << "Caught an exception: " << e.what() << std::endl;
    }

    return 0;
}

Результат вывода:

Caught an exception: My custom exception

Класс исключения

В C++ стандартная библиотека предоставляет некоторые распространённые классы исключений, все из которых наследуются отstd::exception, и доступ к ним можно получить через#include <stdexcept>Подключите для использования.

Ниже приведены некоторые распространённые классы исключений C++ и их основные назначения:

  • std::exception: базовый класс для всех стандартных классов исключений, определяющий базовый интерфейс для исключений. Он имеет виртуальную функциюwhat(), используемую для возврата строки в стиле C, описывающей информацию об исключении.

  • std::runtime_error: указывает на ошибку времени выполнения, обычно исключение, вызванное проблемами логики программы, такими как недопустимые аргументы, невозможность открыть файлы и т. д.

    throw std::runtime_error("Runtime error occurred");
  • std::logic_error: представляет логические ошибки, обычно исключения, вызванные ошибками логики программы, такие как сбои логических утверждений и выход индекса за границы.

     throw std::logic_error("Logic error occurred");
  • std::invalid_argument: указывает, что аргумент, переданный функции, является недопустимым.

    throw std::invalid_argument("Invalid argument");
  • std::out_of_range: указывает на доступ к объекту за пределами его допустимого диапазона, например к массивам и контейнерам.

    throw std::out_of_range("Out of range");
    
  • std::overflow_errorиstd::underflow_error: указывает на переполнение или антипереполнение в численных вычислениях.

    throw std::overflow_error("Overflow occurred");
    throw std::underflow_error("Underflow occurred");
    
  • std::bad_alloc: Указывает на сбой выделения памяти.

    throw std::bad_alloc();  // 内存分配失败时抛出
    

Пример

#include <iostream>
#include <new> // подключить заголовочный файл исключения std::bad_alloc

int main() {
    try {
        // попытка выделить большой объём памяти
        int* largeArray = new int[1000000000000]; // Имитация сбоя выделения памяти
    } catch (const std::bad_alloc& e) {
        // Перехватить исключение std::bad_alloc, вывести сообщение об ошибке
        std::cerr << "Не удалось выделить память: " << e.what() << std::endl;
    }

    return 0;
}

Вывод:

Memory allocation failed: std::bad_alloc

Примечания

  • Исключения не следует использовать для обычного управления потоком; их следует использовать только для обработки исключительных ситуаций.
  • Обработка исключений может влиять на производительность программы, поэтому её следует использовать с осторожностью.
  • Убедитесь, чтоcatchОбрабатывайте все возможные типы исключений в блоке, чтобы программа не завершалась аварийно из-за необработанных исключений.

используя<exception>С помощью этого заголовочного файла программисты на C++ могут более эффективно обрабатывать ошибочные ситуации в программах, повышая устойчивость и надёжность программ.

Другие расширения