std::exception_ptr
Определено в заголовочном файле <exception>
|
||
typedef /*не указано*/ exception_ptr; |
(начиная с C++11) | |
std::exception_ptr
это тип, подобный указателю, допускающий нулевое значение, который управляет объектом исключения, сгенерированным и захваченным с помощью std::current_exception. Экземпляр std::exception_ptr
может быть передан другой функции, возможно, в другом потоке, где исключение может быть сгенерировано повторно и обработано с помощью предложения catch.
Созданный по умолчанию std::exception_ptr
является нулевым указателем; он не указывает на объект исключения.
Два экземпляра std::exception_ptr
при сравнении равны, только если они оба имеют значение null или оба указывают на один и тот же объект исключения.
std::exception_ptr
не может быть неявно преобразован ни в какой арифметический, перечисляемый или указательный тип. Он контекстуально преобразуется в bool
и будет оцениваться как false, если он нулевой, иначе как true.
Объект исключения, на который ссылается std::exception_ptr
, ост��ётся действительным до тех пор, пока остаётся хотя бы один std::exception_ptr
, ссылающийся на него: std::exception_ptr
это умный указатель с общим владением (примечание: это дополнение к обычным правилам времени жизни объекта исключения).
std::exception_ptr
соответствует требованиям NullablePointer.
[править] Пример
#include <exception> #include <iostream> #include <stdexcept> #include <string> void handle_eptr(std::exception_ptr eptr) // передача по значению правильна { try { if (eptr) std::rethrow_exception(eptr); } catch(const std::exception& e) { std::cout << "Поймано исключение: '" << e.what() << "'\n"; } } int main() { std::exception_ptr eptr; try { std::string().at(1); // это генерирует std::out_of_range } catch(...) { eptr = std::current_exception(); // захват } handle_eptr(eptr); } // здесь вызывается деструктор для std::out_of_range, // когда уничтожается eptr
Возможный вывод:
Поймано исключение: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'
[править] Смотрите также
(C++11) |
создаёт std::exception_ptr из объекта исключения (шаблон функции) |
(C++11) |
фиксирует текущее исключение в std::exception_ptr (функция) |
(C++11) |
генерирует исключение из std::exception_ptr (функция) |