Заголовок <exception> определяет несколько типов и функций, связанных с обработкой исключений в программе C ++.
namespace std {
class exception;
class bad_exception;
class nested_exception;
using terminate_handler = void (*)();
terminate_handler get_terminate() noexcept;
terminate_handler set_terminate(terminate_handler f) noexcept;
[[noreturn]] void terminate() noexcept;
int uncaught_exceptions() noexcept;
using exception_ptr = unspecified;
exception_ptr current_exception() noexcept;
[[noreturn]] void rethrow_exception(exception_ptr p);
template<class E> exception_ptr make_exception_ptr(E e) noexcept;
template <class T> [[noreturn]] void throw_with_nested(T&& t);
template <class E> void rethrow_if_nested(const E& e);
}
Смотрите также:[except.special].
namespace std { class exception { public: exception() noexcept; exception(const exception&) noexcept; exception& operator=(const exception&) noexcept; virtual ~exception(); virtual const char* what() const noexcept; }; }
Класс exception определяет базовый класс для типов объектов, создаваемых в качестве исключений компонентами стандартной библиотеки C ++, и определенных выражений для сообщения об ошибках, обнаруженных во время выполнения программы.
Каждый класс стандартной библиотекиT , производный от класса,exception должен иметь общедоступный конструктор копии и общедоступный оператор присваивания копии, которые не завершаются с исключением. Эти функции-члены должны соответствовать следующему постусловию: если два объектаlhs иrhs оба имеют динамический типT иlhs являются копиейrhs, то strcmp(lhs.what(), rhs.what()) должны быть равны 0.
exception() noexcept;
exception(const exception& rhs) noexcept;
exception& operator=(const exception& rhs) noexcept;
Postconditions: Если*this иrhs оба имеют динамический тип,exception значение выраженияstrcmp(what(), rhs.what()) должно быть равно 0.
virtual ~exception();
virtual const char* what() const noexcept;
Remarks: Сообщение может быть null-terminated multibyte string, подходящим для преобразования и отображенным как wstring ([string.classes],[locale.codecvt]). Возвращаемое значение остается действительным до тех пор, пока объект исключения, из которого оно получено, не будет уничтожен или неconst будет вызвана функция, не являющаяся членом объекта исключения.
namespace std { class bad_exception : public exception { public: bad_exception() noexcept; bad_exception(const bad_exception&) noexcept; bad_exception& operator=(const bad_exception&) noexcept; const char* what() const noexcept override; }; }
Класс bad_exception определяет тип объекта, на который ссылаетсяexception_ptr возвращаемый из вызоваcurrent_exception ([propagation]), когда текущий активный объект исключения не удается скопировать.
bad_exception() noexcept;
bad_exception(const bad_exception&) noexcept;
bad_exception& operator=(const bad_exception&) noexcept;
const char* what() const noexcept override;
Remarks: Сообщение может быть null-terminated multibyte string, подходящим для преобразования и отображенным как wstring ([string.classes],[locale.codecvt]).
using terminate_handler = void (*)();
Тип объекта handler function , вызываемого при завершении обработки исключения.std::terminate()
Required behavior: Aterminate_handler должен прекратить выполнение программы, не возвращаясь к вызывающей стороне.
terminate_handler set_terminate(terminate_handler f) noexcept;
Effects: Устанавливает функцию, обозначеннуюf как текущая функция-обработчик для завершения обработки исключения.
Remarks: Не указано, обозначает ли значение нулевого указателя значение по умолчанию terminate_handler.
terminate_handler get_terminate() noexcept;
[[noreturn]] void terminate() noexcept;
Remarks: Вызывается реализацией, когда от обработки исключений необходимо отказаться по любой из нескольких причин ([except.terminate]). Также может вызываться непосредственно программой.
Effects: Вызываетterminate_handler функцию. Не указано, какая terminate_handler функция будет вызываться, если во время вызова активно исключениеset_terminate. В противном случае вызывает текущуюterminate_handler функцию. [ Note: Вterminate_handler этом контексте значение по умолчанию всегда считается вызываемым обработчиком. ] — end note
int uncaught_exceptions() noexcept;
Returns: Количествоuncaught exceptions.
Remarks: Когдаuncaught_exceptions() > 0выброс исключения может привести к вызову std::terminate().
using exception_ptr = unspecified;
exception_ptr должны удовлетворять требованиям NullablePointer.
Два ненулевых значения типаexception_ptr эквивалентны и сравниваются как равные тогда и только тогда, когда они относятся к одному и тому же исключению.
exception_ptr не должен быть неявно преобразован в какой-либо арифметический, перечисляемый или указательный тип.
[ Note: Реализация может использовать интеллектуальный указатель с подсчетом ссылок какexception_ptr. ] — end note
В целях определения наличия гонки данных операции с exception_ptr объектами должны обращаться и изменять только exception_ptr сами объекты, а не исключения, на которые они ссылаются. Использованиеrethrow_exception наexception_ptr объектах, которые ссылаются на один и тот же объект исключения, не должно приводить к гонке за данные. [ Note: Если rethrow_exception повторно генерируется тот же объект исключения (а не копия), одновременный доступ к этому повторно генерированному объекту исключения может привести к гонке данных. Изменения количестваexception_ptr объектов, которые ссылаются на конкретное исключение, не приводят к гонке за данные. ] — end note
exception_ptr current_exception() noexcept;
Returns: exception_ptr Объект , который ссылается на currently handled exception или копию текущего перекачиваемого исключения, или нулевойexception_ptr объект , если исключение не обрабатывается. Указанный объект должен оставаться действительным, по крайней мере, пока существует exception_ptr объект, который на него ссылается. Если функции необходимо выделить память и попытка не удалась, она возвращает exception_ptr объект, который ссылается на экземплярbad_alloc. Не указано, относятся ли возвращаемые значения двух последовательных вызовов к current_exception одному и тому же объекту исключения. [ Note: То есть не указано,current_exception создается ли новая копия каждый раз при ее вызове. ] Если попытка скопировать текущий объект исключения вызывает исключение, функция возвращает объект, который ссылается на сгенерированное исключение или, если это невозможно, на экземпляр . [ Конструктор копирования вызванного исключения также может дать сбой, поэтому реализации разрешено заменять объект, чтобы избежать бесконечной рекурсии. ] — end note exception_ptr bad_exception Note: bad_exception — end note
[[noreturn]] void rethrow_exception(exception_ptr p);
template<class E> exception_ptr make_exception_ptr(E e) noexcept;
Effects: Создаетexception_ptr объект, который ссылается на копиюe, как если бы:
try { throw e; } catch(...) { return current_exception(); }
namespace std {
class nested_exception {
public:
nested_exception() noexcept;
nested_exception(const nested_exception&) noexcept = default;
nested_exception& operator=(const nested_exception&) noexcept = default;
virtual ~nested_exception() = default;
// access functions
[[noreturn]] void rethrow_nested() const;
exception_ptr nested_ptr() const noexcept;
};
template<class T> [[noreturn]] void throw_with_nested(T&& t);
template <class E> void rethrow_if_nested(const E& e);
}
Классnested_exception предназначен для использования в качестве миксина посредством множественного наследования. Он фиксирует текущее обрабатываемое исключение и сохраняет его для дальнейшего использования.
[ Note:nested_exception имеет виртуальный деструктор, чтобы сделать его полиморфным классом. Его наличие можно проверить с помощьюdynamic_cast. ] — end note
nested_exception() noexcept;
[[noreturn]] void rethrow_nested() const;
Effects: Еслиnested_ptr() возвращает нулевой указатель, функция вызываетstd::terminate(). В противном случае он генерирует сохраненное исключение, захваченное*this.
exception_ptr nested_ptr() const noexcept;
template <class T> [[noreturn]] void throw_with_nested(T&& t);
Throws: Еслиis_class_v<U> && !is_final_v<U> && !is_base_of_v<nested_exception, U> этоtrue, исключение неопределенного типа , который публично производный от обоего U иnested_exception и построенногоstd::forward<T>(t), в противном случае std::forward<T>(t).
template <class E> void rethrow_if_nested(const E& e);