Sdílet prostřednictvím


<exception> – funkce

current_exception

Získá inteligentní ukazatel na aktuální výjimku.

exception_ptr current_exception();

Vrácená 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.

Vrácená 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í.

Vrácená 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.

Vrácená 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();

Vrácená 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čenoabort nebo exit.

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.