<exception>
– funkce
current_exception
Získá inteligentní ukazatel na aktuální výjimku.
exception_ptr current_exception();
Návratová hodnota
Objekt exception_ptr odkazující na aktuální výjimku.
Poznámky
current_exception
Volání funkce v bloku catch Pokud je výjimka ve testovacím stavu a blok catch může výjimku zachytit, current_exception
vrátí funkce exception_ptr
objekt, který odkazuje na výjimku. V opačném případě funkce vrátí objekt null exception_ptr
.
Funkce current_exception
zachycuje výjimku, která je v testovacím prostředí bez ohledu na to, zda catch
příkaz určuje příkaz exception-declaration .
Destruktor aktuální výjimky se volá na konci catch
bloku, pokud výjimku znovu nenasadíte. I když však voláte current_exception
funkci v destruktoru, vrátí exception_ptr
funkce objekt, který odkazuje na aktuální výjimku.
Následná volání current_exception
funkce vrací exception_ptr
objekty, které odkazují na různé kopie aktuální výjimky. V důsledku toho se objekty při porovnání jeví jako nerovné, protože odkazují na jiné kopie, i přesto, že kopie mají stejné binární hodnoty.
make_exception_ptr
Vytvoří objekt exception_ptr, který obsahuje kopii výjimky.
template <class E>
exception_ptr make_exception_ptr(E Except);
Parametry
Kromě
Třída s výjimkou pro kopírování Obvykle zadáte objekt třídy výjimky jako argument funkcemake_exception_ptr
, i když jakýkoli objekt třídy může být argument.
Návratová hodnota
Objekt exception_ptr odkazující na kopii aktuální výjimky pro výjimku s výjimkou.
Poznámky
make_exception_ptr
Volání funkce je ekvivalentní vyvolání výjimky jazyka C++, zachycení v bloku catch a následné volání funkce current_exception k vrácení exception_ptr
objektu, který odkazuje na výjimku. Implementace funkce Microsoftu make_exception_ptr
je efektivnější než vyvolání a zachycení výjimky.
Aplikace obvykle funkci nevyžaduje make_exception_ptr
a nedoporučujeme její použití.
rethrow_exception
Vyvolá výjimku předanou jako parametr.
void rethrow_exception(exception_ptr P);
Parametry
P
Zachycená výjimka, kterou chcete znovu vyvolat. Pokud je P null exception_ptr, funkce vyvolá std::bad_exception.
Poznámky
Po uložení zachycené výjimky v objektu exception_ptr
může primární vlákno zpracovat objekt. V primárním rethrow_exception
vlákně zavolejte funkci společně s objektem exception_ptr
jako jeho argument. Funkce rethrow_exception
extrahuje výjimku z objektu exception_ptr
a potom vyvolá výjimku v kontextu primárního vlákna.
get_terminate
Získá aktuální terminate_handler
funkci.
terminate_handler get_terminate();
set_terminate
Vytvoří novou terminate_handler
, která se bude volat při ukončení programu.
terminate_handler set_terminate(terminate_handler fnew) throw();
Parametry
fnew
Funkce, která se má volat při ukončení.
Návratová hodnota
Adresa předchozí funkce, která byla volána při ukončení.
Poznámky
Funkce vytvoří novou terminate_handler jako funkci * fnew. Proto nesmí být fnew ukazatelem null. Funkce vrátí adresu předchozí obslužné rutiny ukončení.
Příklad
// 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
Získá aktuální unexpected_handler
funkci.
unexpected_handler get_unexpected();
rethrow_if_nested
template <class E>
void rethrow_if_nested(const E& e);
Poznámky
Pokud není polymorfní typ třídy nebo pokud nested_exception
je nepřístupný nebo nejednoznačný, neexistuje žádný účinek. V opačném případě provede dynamické přetypování.
set_unexpected
Vytvoří novou unexpected_handler
, která bude, když dojde k neočekávané výjimce.
unexpected_handler set_unexpected(unexpected_handler fnew) throw();
Parametry
fnew
Funkce, která se má volat, když dojde k neočekávané výjimce.
Návratová hodnota
Adresa předchozího unexpected_handler
.
Poznámky
Funkce fnew nesmí být ukazatelem null.
Standard jazyka C++ vyžaduje, aby byla unexpected
volána, když funkce vyvolá výjimku, která není v seznamu vyvolání. Aktuální implementace tuto funkci nepodporuje. Následující příklad volání unexpected
přímo, který pak volá unexpected_handler
.
Příklad
// 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
}
ukončit
Zavolá obslužnou rutinu ukončení.
void terminate();
Poznámky
Funkce volá obslužnou rutinu ukončení, funkci typu void
. Pokud terminate
je volána přímo programem, obslužná rutina ukončení je ta, která je naposledy nastavena voláním set_terminate. Pokud terminate
je volána z některého z několika dalších důvodů během vyhodnocení výrazu throw, obslužná rutina ukončení je ten, který se projeví okamžitě po vyhodnocení výrazu throw.
Obslužná rutina ukončení se nemusí vrátit do volajícího. Při spuštění programu je obslužná rutina ukončení funkce, která volá abort
.
Příklad
Podívejte se na set_unexpected příklad použití terminate
.
throw_with_nested
template <class T> [[noreturn]]
void throw_with_nested(T&& t);
Poznámky
Vyvolá výjimku s vnořenými výjimkami.
uncaught_exception
Vrátí true
pouze v případě, že se právě zpracovává vyvolána výjimka.
bool uncaught_exception();
Návratová hodnota
Vrátí true
po dokončení vyhodnocení výrazu throw a před dokončením inicializace deklarace výjimky v odpovídající obslužné rutině nebo volání neočekávaně v důsledku výrazu throw. Konkrétně se vrátí true
při uncaught_exception
zavolání z destruktoru, který je vyvolán během odvíjení výjimky. Na zařízeních uncaught_exception
se podporuje jenom na systém Windows CE 5.00 a vyšších verzích, včetně platforem Windows Mobile 2005.
Příklad
// 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
neočekávaný
Volá neočekávanou obslužnou rutinu.
void unexpected();
Poznámky
Standard jazyka C++ vyžaduje, aby byla unexpected
volána, když funkce vyvolá výjimku, která není v seznamu vyvolání. Aktuální implementace tuto funkci nepodporuje. Příklad volání unexpected
přímo, která volá neočekávanou obslužnou rutinu.
Funkce volá neočekávanou obslužnou rutinu, funkci typu void
. Pokud unexpected
je volána přímo programem, neočekávaná obslužná rutina je ta, která je naposledy nastavena voláním set_unexpected.
Neočekávaná obslužná rutina se nemusí vrátit do volajícího. Spuštění může ukončit pomocí:
Vyvolání objektu typu uvedeného ve specifikaci výjimky nebo objektu libovolného typu, pokud je neočekávaná obslužná rutina volána přímo programem.
Vyvolání objektu typu bad_exception
Volání je ukončeno
abort
neboexit
.
Při spuštění programu je neočekávaná obslužná rutina funkcí, která volá ukončení.
Příklad
Podívejte se na set_unexpected příklad použití unexpected
.