Стандартная библиотека 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 <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 <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++ могут более эффективно обрабатывать ошибочные ситуации в программах, повышая устойчивость и надёжность программ.