Библиотека обработки исключений 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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::underflow_error("Произошла ошибка антипереполнения");
    } catch (const std::underflow_error& e) {
        std::cout << "Перехвачена ошибка антипереполнения: " << e.what() << std::endl;
    }
    return 0;
}

Использование пользовательских классов исключений

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

Пример

#include <iostream>
#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>Классы исключений в нем очень важны.

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