Библиотека обработки исключений C++ <stdexcept>
<stdexcept>Является заголовочным файлом в стандартной библиотеке C++, который определяет набор стандартных классов исключений для обработки ошибок во время выполнения программы.
Исключения — это ошибки, возникающие во время выполнения программы; их можно перехватывать и обрабатывать, чтобы предотвратить аварийное завершение программы.<stdexcept>Заголовочный файл определяет набор классов, производных отstd::exceptionПроизводные классы исключений, предоставляющие стандартный способ сообщения об ошибках и их обработки.
Синтаксис
Чтобы использовать<stdexcept>Для использования соответствующих классов исключений сначала необходимо включить этот заголовочный файл:
#include <stdexcept>
Затем вы можете использовать эти классы исключений для генерации и перехвата исключений. Например:
throw std::runtime_error("An error occurred");
Класс исключения
<stdexcept>Заголовочный файл определяет следующие классы исключений:
std::exception: Базовый класс всех стандартных классов исключений.std::bad_exception: Выбрасывается, когда во время обработки исключения возникает ошибка.std::bad_alloc: Выбрасывается при сбое выделения памяти.std::bad_cast: Выбрасывается при сбое преобразования типа.std::bad_typeid: когдаtypeidВыбрасывается, когда операция завершается неудачно.std::logic_error: Выбрасывается, когда возникает логическая ошибка, например недопустимый входной параметр.std::domain_error: Выбрасывается, когда аргумент вызова функции выходит за пределы допустимого диапазона.std::invalid_argument: Выбрасывается, когда аргумент вызова функции недопустим.std::length_error: Выбрасывается, когда операция с контейнером завершается неудачно из-за ограничений длины.std::out_of_range: Выбрасывается, когда в контейнере выполняется доступ к недопустимому индексу.std::overflow_error: Выбрасывается, когда арифметические операции вызывают переполнение.std::range_error: Выбрасывается, когда возвращаемое значение функции выходит за пределы ожидаемого диапазона.std::underflow_error: Выбрасывается, когда арифметические операции вызывают нижнее переполнение.
Пример
Ниже приведён пример использования<stdexcept>Простой пример, демонстрирующий, как выбрасывать и перехватывать исключения:
Пример
#include <stdexcept>
void riskyFunction(int x) {
if (x < 0) {
throw std::invalid_argument("Отрицательное значение не допускается");
}
std::cout << "Обработка " << x << std::endl;
}
int main() {
try {
riskyFunction(-1);
} catch (const std::invalid_argument& e) {
std::cerr << "Перехвачено исключение: " << e.what() << std::endl;
}
return 0;
}
Вывод:
Caught an exception: Negative value not allowed
В этом примере,riskyFunctionФункция проверяет, является ли переданный параметр отрицательным; если да, то она выбрасываетstd::invalid_argumentисключение. ВmainВ функции мы используемtry-catchблок для перехвата и обработки этого исключения.
Стандартные классы исключений
std::exception
std::exception — базовый класс для всех стандартных классов исключений. Он предоставляет виртуальную функцию what(), возвращающую строку с описанием исключения.
Пример
#include <exception>
int main() {
try {
throw std::exception();
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
std::logic_error
std::logic_error является производным от std::exception и представляет ошибки логики программы. Это абстрактный базовый класс, обычно конкретизируемый производными классами.
Пример
#include <stdexcept>
int main() {
try {
throw std::logic_error("Произошла логическая ошибка");
} catch (const std::logic_error& e) {
std::cout << "Перехвачена логическая ошибка: " << e.what() << std::endl;
}
return 0;
}
std::invalid_argument
std::invalid_argument является производным от std::logic_error и указывает, что был передан недопустимый аргумент.
Пример
#include <stdexcept>
int main() {
try {
throw std::invalid_argument("Передан недопустимый аргумент");
} catch (const std::invalid_argument& e) {
std::cout << "Перехвачен недопустимый аргумент: " << e.what() << std::endl;
}
return 0;
}
std::domain_error
std::domain_error является производным от std::logic_error и указывает, что аргумент находится вне допустимой области определения.
Пример
#include <stdexcept>
int main() {
try {
throw std::domain_error("Произошла ошибка области определения");
} catch (const std::domain_error& e) {
std::cout << "Перехвачена ошибка области определения: " << e.what() << std::endl;
}
return 0;
}
std::length_error
std::length_error является производным от std::logic_error и представляет ошибку длины, например превышение максимального ограничения длины в операциях с контейнерами.
Пример
#include <stdexcept>
int main() {
try {
throw std::length_error("Произошла ошибка длины");
} catch (const std::length_error& e) {
std::cout << "Перехвачена ошибка длины: " << e.what() << std::endl;
}
return 0;
}
std::out_of_range
std::out_of_range наследуется от std::logic_error, что указывает на выход доступа за пределы диапазона.
Пример
#include <stdexcept>
int main() {
try {
throw std::out_of_range("Произошла ошибка выхода за пределы диапазона");
} catch (const std::out_of_range& e) {
std::cout << "Перехвачена ошибка выхода за пределы диапазона: " << e.what() << std::endl;
}
return 0;
}
std::runtime_error
std::runtime_error наследуется от std::exception и представляет ошибки времени выполнения программы. Это абстрактный базовый класс, обычно конкретизируемый производными классами.
Пример
#include <stdexcept>
int main() {
try {
throw std::runtime_error("Произошла ошибка времени выполнения");
} catch (const std::runtime_error& e) {
std::cout << "Перехвачена ошибка времени выполнения: " << e.what() << std::endl;
}
return 0;
}
std::range_error
std::range_error наследуется от std::runtime_error и указывает на то, что результат вычисления превышает представимый диапазон.
Пример
#include <stdexcept>
int main() {
try {
throw std::range_error("Произошла ошибка диапазона");
} catch (const std::range_error& e) {
std::cout << "Перехвачена ошибка диапазона: " << e.what() << std::endl;
}
return 0;
}
std::overflow_error
std::overflow_error наследуется от std::runtime_error, указывая на ошибку арифметического переполнения.
Пример
#include <stdexcept>
int main() {
try {
throw std::overflow_error("Произошла ошибка переполнения");
} catch (const std::overflow_error& e) {
std::cout << "Перехвачена ошибка переполнения: " << e.what() << std::endl;
}
return 0;
}
std::underflow_error
std::underflow_error наследуется от std::runtime_error, указывая на ошибку арифметического антипереполнения.
Пример
#include <stdexcept>
int main() {
try {
throw std::underflow_error("Произошла ошибка антипереполнения");
} catch (const std::underflow_error& e) {
std::cout << "Перехвачена ошибка антипереполнения: " << e.what() << std::endl;
}
return 0;
}
Использование пользовательских классов исключений
Помимо стандартных классов исключений, мы также можем определять собственные классы исключений, которые наследуются от стандартных классов исключений.
Пример
#include <stdexcept>
class MyException : public std::runtime_error {
public:
MyException(const std::string& message) : std::runtime_error(message) {}
};
int main() {
try {
throw MyException("Возникло мое пользовательское исключение");
} catch (const MyException& e) {
std::cout << "Перехвачено пользовательское исключение: " << e.what() << std::endl;
}
return 0;
}
<stdexcept>Это важный компонент стандартной библиотеки C++. Он предоставляет набор стандартных классов исключений, делая обработку ошибок более последовательной и предсказуемой. Используя эти классы исключений, вы можете писать более надежный и легко поддерживаемый код. Для начинающих понимание базовых концепций исключений и того, как их использовать ...<stdexcept>Классы исключений в нем очень важны.