◐ Shell
clean mode source ↗

std::exception_ptr — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

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)'

Смотрите также