<exception>, funkcje

Current_exception

Uzyskuje inteligentny wskaźnik na bieżący wyjątek.

exception_ptr current_exception();

Wartość zwracana

Obiekt exception_ptr wskazujący bieżący wyjątek.

Uwagi

Wywołaj current_exception funkcję w bloku catch. Jeśli wyjątek jest w locie, a blok catch może przechwytywać wyjątek, current_exception funkcja zwraca exception_ptr obiekt, który odwołuje się do wyjątku. W przeciwnym razie funkcja zwraca obiekt o wartości null exception_ptr .

Funkcja current_exception przechwytuje wyjątek, który jest w locie, niezależnie od tego, czy catch instrukcja określa instrukcję deklaracji wyjątku.

Destruktor dla bieżącego wyjątku jest wywoływany na końcu catch bloku, jeśli nie zostanie ponownie wywrócony wyjątek. Jednak nawet jeśli wywołasz current_exception funkcję w destruktorze, funkcja zwraca exception_ptr obiekt, który odwołuje się do bieżącego wyjątku.

Kolejne wywołania current_exception funkcji zwracają exception_ptr obiekty odwołujące się do różnych kopii bieżącego wyjątku. W związku z tym obiekty są porównane jako nierówne, ponieważ odnoszą się one do poszczególnych kopii, mimo że kopie mają tę samą wartość binarną.

make_exception_ptr

Tworzy obiekt exception_ptr, który przechowuje kopię wyjątku.

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

Parametry

Oprócz
Klasa z wyjątkiem do skopiowania. Zazwyczaj obiekt klasy wyjątku jest określany jako argument make_exception_ptr funkcji, chociaż każdy obiekt klasy może być argumentem.

Wartość zwracana

Obiekt exception_ptr wskazujący kopię bieżącego wyjątku z wyjątkiem.

Uwagi

make_exception_ptr Wywoływanie funkcji jest równoważne zgłaszaniu wyjątku języka C++, przechwytywaniu go w bloku catch, a następnie wywoływaniu funkcji current_exception w celu zwrócenia exception_ptr obiektu, który odwołuje się do wyjątku. Implementacja funkcji przez make_exception_ptr firmę Microsoft jest wydajniejsza niż zgłaszanie, a następnie przechwytywanie wyjątku.

Aplikacja zwykle nie wymaga make_exception_ptr funkcji i odradzamy jej używanie.

rethrow_exception

Zgłasza wyjątek przekazany jako parametr.

void rethrow_exception(exception_ptr P);

Parametry

P
Przechwycony wyjątek do ponownego zgłoszenia. Jeśli P jest exception_ptr o wartości null, funkcja zgłasza wartość std::bad_exception.

Uwagi

Po przechowywaniu przechwyconego wyjątku w exception_ptr obiekcie wątek podstawowy może przetworzyć obiekt. W wątku podstawowym wywołaj rethrow_exception funkcję razem z obiektem exception_ptr jako argumentem. Funkcja rethrow_exception wyodrębnia wyjątek z exception_ptr obiektu, a następnie zgłasza wyjątek w kontekście wątku podstawowego.

get_terminate

Uzyskuje bieżącą terminate_handler funkcję.

terminate_handler get_terminate();

set_terminate

Ustanawia nowe terminate_handler , które mają być wywoływane po zakończeniu programu.

terminate_handler set_terminate(terminate_handler fnew) throw();

Parametry

fnew
Funkcja, która ma być wywoływana po zakończeniu.

Wartość zwracana

Adres poprzedniej funkcji, która była wywoływana po zakończeniu.

Uwagi

Funkcja ustanawia nową terminate_handler jako funkcję * fnew. W związku z tym fnew nie może być wskaźnikiem o wartości null. Funkcja zwraca adres poprzedniej procedury obsługi zakończenia.

Przykład

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

Uzyskuje bieżącą unexpected_handler funkcję.

unexpected_handler get_unexpected();

rethrow_if_nested

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

Uwagi

Jeśli nie typ klasy polimorficznej lub jest nested_exception niedostępny lub niejednoznaczny, nie ma żadnego efektu. W przeciwnym razie wykonuje rzutowanie dynamiczne.

set_unexpected

Ustanawia nowy unexpected_handler element, który ma zostać napotkany po napotkaniu nieoczekiwanego wyjątku.

unexpected_handler set_unexpected(unexpected_handler fnew) throw();

Parametry

fnew
Funkcja, która ma być wywoływana w przypadku napotkania nieoczekiwanego wyjątku.

Wartość zwracana

Adres poprzedniego unexpected_handlerelementu .

Uwagi

fnew nie może być wskaźnikiem o wartości null.

Standard C++ wymaga wywołania, unexpected gdy funkcja zgłasza wyjątek, który nie znajduje się na liście rzutów. Bieżąca implementacja nie obsługuje tej funkcji. Poniższy przykład wywołuje metodę unexpected bezpośrednio, co powoduje wywołanie metody unexpected_handler.

Przykład

// 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
}

Zakończyć

Wywołuje terminate_handler.

void terminate();

Uwagi

Funkcja wywołuje procedurę obsługi zakończenia, funkcję typu void. Jeśli terminate program jest wywoływany bezpośrednio, procedura obsługi zakończenia jest ostatnio ustawiana przez wywołanie set_terminate. Jeśli terminate jest wywoływana z kilku innych powodów podczas obliczania wyrażenia throw, procedura obsługi zakończenia jest obowiązuje bezpośrednio po ocenie wyrażenia throw.

Procedura obsługi zakończenia może nie wrócić do elementu wywołującego. Podczas uruchamiania programu procedura obsługi zakończenia jest funkcją, która wywołuje abortmetodę .

Przykład

Zobacz set_unexpected , aby zapoznać się z przykładem użycia elementu terminate.

throw_with_nested

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

Uwagi

Zgłasza wyjątek z wyjątkami zagnieżdżonym.

uncaught_exception

Zwraca wartość true tylko wtedy, gdy zgłaszany wyjątek jest obecnie przetwarzany.

bool uncaught_exception();

Wartość zwracana

Zwraca wartość true po zakończeniu oceny wyrażenia throw i przed ukończeniem inicjowania deklaracji wyjątku w zgodnej procedurze obsługi lub wywołaniu nieoczekiwanego wyniku wyrażenia throw. W szczególności uncaught_exception funkcja zwróci true wywołanie z destruktora, który jest wywoływany podczas odwijania wyjątku. Na urządzeniach jest obsługiwana tylko w systemach uncaught_exception Windows CE 5.00 i nowszych, w tym na platformach Windows Mobile 2005.

Przykład

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

Nieoczekiwane

Wywołuje nieoczekiwaną procedurę obsługi.

void unexpected();

Uwagi

Standard C++ wymaga wywołania, unexpected gdy funkcja zgłasza wyjątek, który nie znajduje się na liście rzutów. Bieżąca implementacja nie obsługuje tej funkcji. Przykład wywołuje unexpected bezpośrednio metodę , która wywołuje nieoczekiwaną procedurę obsługi.

Funkcja wywołuje nieoczekiwaną procedurę obsługi, funkcję typu void. Jeśli unexpected program jest wywoływany bezpośrednio, nieoczekiwana procedura obsługi jest ostatnio ustawiana przez wywołanie set_unexpected.

Nieoczekiwana procedura obsługi może nie wrócić do elementu wywołującego. Wykonanie może zakończyć się przez:

  • Zgłaszanie obiektu typu wymienionego w specyfikacji wyjątku lub obiektu dowolnego typu, jeśli nieoczekiwana procedura obsługi jest wywoływana bezpośrednio przez program.

  • Zgłaszanie obiektu typu bad_exception.

  • Wywoływanie zakończenia abortlub exit.

Podczas uruchamiania programu nieoczekiwana procedura obsługi jest funkcją, która wywołuje zakończenie.

Przykład

Zobacz set_unexpected , aby zapoznać się z przykładem użycia elementu unexpected.