<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
.