Поделиться через


<exception>Функции

current_exception

Получает интеллектуальный указатель на текущее исключение.

exception_ptr current_exception();

Возвращаемое значение

Объект exception_ptr, указывающий на текущее исключение.

Замечания

Вызовите функцию current_exception в блоке catch. Если исключение находится в полете и блок перехвата может перехватить это исключение, функция current_exception возвращает объект exception_ptr, который ссылается на это исключение. В противном случае функция возвращает объект exception_ptr со значением null.

Функция current_exception перехватывает исключение, находящееся в полете, независимо от того, определяет ли catch оператор объявления исключения.

Деструктор для текущего исключения вызывается в конце блока catch, если не требуется повторно создавать исключение. Но даже при вызове функции current_exception в деструкторе эта функция возвращает объект exception_ptr, который ссылается на текущее исключение.

Последующие вызовы функции current_exception возвращают объекты exception_ptr, которые ссылаются на различные копии текущего исключения. Соответственно, при сравнении объекты не признаются равными, поскольку они ссылаются на различные копии, даже если эти копии имеют одинаковые бинарные значения.

make_exception_ptr

Создает объект exception_ptr, содержащий копию исключения.

template <class E>
    exception_ptr make_exception_ptr(E Except);

Параметры

Except
Класс с исключением, подлежащим копированию. Обычно объект класс исключений указывается в качестве аргумента функции make_exception_ptr, однако аргументом может быть любой объект класса.

Возвращаемое значение

Объект exception_ptr , указывающий на копию текущего исключения за исключением.

Замечания

Вызов функции make_exception_ptr аналогичен созданию исключения C++, его перехвату в блоке catch и последующему вызову функции current_exception для возвращения объекта exception_ptr, ссылающегося на это исключение. Реализация Майкрософт для функции make_exception_ptr является более эффективной, чем создание и последующий перехват исключения.

Приложение обычно не требует функции make_exception_ptr, и мы не рекомендуем использовать ее.

rethrow_exception

Создает исключение, переданное в качестве параметра.

void rethrow_exception(exception_ptr P);

Параметры

P
Перехваченное исключение, подлежащее повторному вызову. Если P является пустым exception_ptr, функция вызывает std::bad_exception.

Замечания

После сохранения перехваченного исключения в объект exception_ptr основной поток может обработать этот объект. В основном потоке вызовите функцию rethrow_exception, указав объект exception_ptr в качестве аргумента. Функция rethrow_exception извлекает исключение из объекта exception_ptr и затем вызывает это исключение в контексте основного потока.

get_terminate

Получает текущую функцию terminate_handler.

terminate_handler get_terminate();

set_terminate

Создает новый terminate_handler, подлежащий вызову при завершении программы.

terminate_handler set_terminate(terminate_handler fnew) throw();

Параметры

fnew
Функция, которая должна вызываться при завершении.

Возвращаемое значение

Адрес предыдущей функция, используемой для вызова при завершении.

Замечания

Функция устанавливает новый terminate_handler в качестве функции * fnew. Таким образом, fnew не должен быть пустым указателем. Функция возвращает адрес предыдущего обработчика завершения.

Пример

// exception_set_terminate.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>

using namespace std;

void termfunction()
{
    cout << "My terminate function called." << endl;
    abort();
}

int main()
{
    terminate_handler oldHandler = set_terminate(termfunction);

    // Throwing an unhandled exception would also terminate the program
    // or we could explicitly call terminate();

    //throw bad_alloc();
    terminate();
}

get_unexpected

Получает текущую функцию unexpected_handler.

unexpected_handler get_unexpected();

rethrow_if_nested

template <class E>
    void rethrow_if_nested(const E& e);

Замечания

Если не тип полиморфного класса, или если nested_exception он недоступен или неоднозначный, то нет эффекта. В противном случае выполняет динамический приведение.

set_unexpected

Создает новый unexpected_handler, подлежащий вызову при обнаружении неожиданного исключения.

unexpected_handler set_unexpected(unexpected_handler fnew) throw();

Параметры

fnew
Функция, предназначенная для вызова при обнаружении непредвиденного исключения.

Возвращаемое значение

Адрес предыдущего обработчика unexpected_handler.

Замечания

fnew не должен быть указателем null.

Стандарт C++ требует вызова unexpected в том случае, когда функция создает исключение, которого нет в ее списке throw. Текущая реализация это не поддерживает. В следующем примере unexpected вызывается напрямую, который затем вызывает unexpected_handler.

Пример

// exception_set_unexpected.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>

using namespace std;

void uefunction()
{
    cout << "My unhandled exception function called." << endl;
    terminate(); // this is what unexpected() calls by default
}

int main()
{
    unexpected_handler oldHandler = set_unexpected(uefunction);

    unexpected(); // library function to force calling the
                  // current unexpected handler
}

terminate

Вызывает обработчик завершения.

void terminate();

Замечания

Функция вызывает обработчик завершения, функцию типа void. Если terminate он вызывается непосредственно программой, обработчик завершения является последним, заданным вызовом set_terminate. Если terminate вызывается по какой-либо из нескольких других причин во время оценки выражения броска, обработчик завершения является одним в действии сразу после оценки выражения броска.

Обработчик завершения не может вернуть значение в вызывающий его объект. При запуске программы обработчик завершения — это функция, которая вызывает abort.

Пример

См. set_unexpected в качестве примера использования terminate.

throw_with_nested

template <class T> [[noreturn]]
    void throw_with_nested(T&& t);

Замечания

Создает исключение с вложенными исключениями.

uncaught_exception

Возвращает true, только если созданное исключение в настоящий момент обрабатывается.

bool uncaught_exception();

Возвращаемое значение

Возвращает true после вычисления выражения throw и до завершения инициализации объявления исключения в соответствующем обработчике или вызова функции unexpected в результате выражения throw. В частности, uncaught_exception вернет true при вызове из деструктора, который вызывается во время очистки исключения. На устройствах uncaught_exception поддерживается только на платформе Windows CE 5.00 и более поздних версий, включая Windows Mobile 2005.

Пример

// exception_uncaught_exception.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
#include <string>

class Test
{
public:
   Test( std::string msg ) : m_msg( msg )
   {
      std::cout << "In Test::Test(\"" << m_msg << "\")" << std::endl;
   }
   ~Test( )
   {
      std::cout << "In Test::~Test(\"" << m_msg << "\")" << std::endl
         << "        std::uncaught_exception( ) = "
         << std::uncaught_exception( )
         << std::endl;
   }
private:
    std::string m_msg;
};

// uncaught_exception will be true in the destructor
// for the object created inside the try block because
// the destructor is being called as part of the unwind.

int main( void )
   {
      Test t1( "outside try block" );
      try
      {
         Test t2( "inside try block" );
         throw 1;
      }
      catch (...) {
   }
}
In Test::Test("outside try block")
In Test::Test("inside try block")
In Test::~Test("inside try block")
        std::uncaught_exception( ) = 1
In Test::~Test("outside try block")
        std::uncaught_exception( ) = 0

непредвиденный

Вызывает обработчик неожиданных исключений.

void unexpected();

Замечания

Стандарт C++ требует вызова unexpected в том случае, когда функция создает исключение, которого нет в ее списке throw. Текущая реализация это не поддерживает. В данном примере unexpected вызывается напрямую, что вызывает обработчик неожиданных исключений.

Функция вызывает обработчик неожиданных исключений, функцию типа void. Если unexpected вызывается непосредственно программой, в качестве обработчика неожиданных исключений используется последний обработчик, установленный вызовом метода set_unexpected.

Обработчик неожиданных исключений не может вернуть значение в вызывающий его объект. Он может завершить выполнение следующим образом:

  • Создание объекта типа, представленного в спецификации исключений, или объекта любого типа, если обработчик неожиданных исключений вызывается непосредственно программой.

  • Создание объекта типа bad_exception.

  • abortЗавершение вызова или exit.

При запуске программы обработчик неожиданных исключений — это функция, которая вызывает функцию terminate.

Пример

См. set_unexpected в качестве примера использования unexpected.