<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_handler
elementu .
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 abort
metodę .
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
nieoczekiwany
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
abort
lubexit
.
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
.