fonctions<exception>
current_exception
Obtient un pointeur intelligent vers l'exception actuelle.
exception_ptr current_exception();
Valeur de retour
Objet exception_ptr qui pointe vers l’exception actuelle.
Notes
Appelez la fonction current_exception
dans un bloc catch. Si une exception a été levée et si le bloc catch peut l'intercepter, la fonction current_exception
retourne un objet exception_ptr
qui référence l'exception. Sinon, la fonction retourne un objet exception_ptr
null.
La fonction current_exception
capture l’exception en vol même si l’instruction catch
spécifie une instruction exception-declaration.
Le destructeur de l'exception actuelle est appelé à la fin du bloc catch
si vous n'avez pas levé à nouveau l'exception. Toutefois, même si vous appelez la fonction current_exception
dans le destructeur, celle-ci retourne un objet exception_ptr
qui référence l’exception actuelle.
Les appels successifs à la fonction current_exception
retournent des objets exception_ptr
qui font référence à des copies de l'exception actuelle. Par conséquent, les objets sont considérés comme inégaux car ils font référence à des copies, bien que les copies aient la même valeur binaire.
make_exception_ptr
Crée un objet exception_ptr qui contient une copie d’une exception.
template <class E>
exception_ptr make_exception_ptr(E Except);
Paramètres
Except (Excepter)
Classe avec l'exception à copier. Généralement, vous spécifiez un objet de classe exception comme argument pour la fonction make_exception_ptr
, bien que tout objet de classe puisse être l’argument.
Valeur de retour
Objet exception_ptr pointant vers une copie de l’exception actuelle pour Except.
Notes
L’appel de la fonction make_exception_ptr
équivaut à lever une exception C++, à l’intercepter dans un bloc catch, puis à appeler la fonction current_exception pour retourner un objet exception_ptr
qui référence l’exception. L'implémentation Microsoft de la fonction make_exception_ptr
est plus efficace que le fait de lever puis d'intercepter une exception.
En général, une application ne requiert pas la fonction make_exception_ptr
, et son utilisation est d'ailleurs déconseillée.
rethrow_exception
Lève une exception passée comme paramètre.
void rethrow_exception(exception_ptr P);
Paramètres
P
L'exception interceptée à lever de nouveau. Si P est une exception_ptr Null, la fonction lève std ::bad_exception.
Notes
Après avoir enregistré une exception interceptée dans un objet exception_ptr
, le thread principal peut traiter l'objet. Dans votre thread principal, appelez la fonction rethrow_exception
avec l'objet exception_ptr
en tant qu'argument. La fonction rethrow_exception
extrait l'exception de l'objet exception_ptr
puis lève l'exception dans le contexte du thread principal.
get_terminate
Obtient la fonction terminate_handler
actuelle.
terminate_handler get_terminate();
set_terminate
Génère un nouvel appel à terminate_handler
à l'arrêt du programme.
terminate_handler set_terminate(terminate_handler fnew) throw();
Paramètres
fnew
La fonction doit être appelée à la fin.
Valeur de retour
Adresse de la fonction précédente utilisée à appeler à la fin.
Notes
La fonction établit une nouvelle terminate_handler comme fonction * fnew. Par conséquent, fnew ne doit pas être un pointeur Null. La fonction retourne l’adresse du gestionnaire d’arrêt précédent.
Exemple
// 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
Obtient la fonction unexpected_handler
actuelle.
unexpected_handler get_unexpected();
rethrow_if_nested
template <class E>
void rethrow_if_nested(const E& e);
Notes
Si ce n’est pas un type de classe polymorphe, ou s’il nested_exception
est inaccessible ou ambigu, il n’y a aucun effet. Sinon, effectue un cast dynamique.
set_unexpected
Génère un nouveau unexpected_handler
à appeler en cas d'exception inattendue.
unexpected_handler set_unexpected(unexpected_handler fnew) throw();
Paramètres
fnew
Fonction à appeler en cas d’exception inattendue.
Valeur de retour
Adresse du unexpected_handler
précédent.
Notes
fnew ne doit pas être un pointeur Null.
La norme C++ nécessite l’appel de unexpected
quand une fonction lève une exception qui n’est pas dans sa liste d’exceptions à lever. L’implémentation actuelle ne le prend pas en charge. L’exemple suivant appelle unexpected
directement, qui appelle ensuite le unexpected_handler
.
Exemple
// 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
Appelle un gestionnaire d'arrêt.
void terminate();
Notes
La fonction appelle un gestionnaire d’arrêt, une fonction de type void
. S’il terminate
est appelé directement par le programme, le gestionnaire d’arrêt est celui qui est le plus récemment défini par un appel à set_terminate. Si terminate
elle est appelée pour plusieurs autres raisons lors de l’évaluation d’une expression levée, le gestionnaire d’arrêt est celui en vigueur immédiatement après l’évaluation de l’expression levée.
Un gestionnaire d’arrêt ne peut pas retourner à son appelant. Au démarrage du programme, le gestionnaire d’arrêt est une fonction qui appelle abort
.
Exemple
Consultez set_unexpected pour obtenir un exemple d’utilisation de terminate
.
throw_with_nested
template <class T> [[noreturn]]
void throw_with_nested(T&& t);
Notes
Lève une exception avec des exceptions imbriquées.
uncaught_exception
Retourne true
uniquement si une exception levée est actuellement traitée.
bool uncaught_exception();
Valeur de retour
Retourne true
à la fin de l’évaluation d’une expression throw et avant la fin de l’initialisation de la déclaration d’exception dans le gestionnaire correspondant, ou en appelant unexpected suite à l’expression throw. En particulier, uncaught_exception
retourne true
quand elle est appelée à partir d’un destructeur lui-même appelé pendant le déroulement d’une exception. Concernant les appareils, uncaught_exception
est uniquement pris en charge sur Windows CE 5.00 et versions supérieures, notamment les plateformes Windows Mobile 2005.
Exemple
// 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
inattendu
Appelle le gestionnaire d’exceptions inattendues.
void unexpected();
Notes
La norme C++ nécessite l’appel de unexpected
quand une fonction lève une exception qui n’est pas dans sa liste d’exceptions à lever. L’implémentation actuelle ne le prend pas en charge. L’exemple appelle unexpected
directement, qui appelle le gestionnaire d’exceptions inattendues.
La fonction appelle un gestionnaire d’exceptions inattendues, une fonction de type void
. Si le programme appelle directement unexpected
, le gestionnaire d’exceptions inattendues est le dernier défini par un appel à set_unexpected.
Un gestionnaire d’exceptions inattendues ne peut pas retourner à son appelant. Il peut mettre fin à l’exécution en effectuant l’une des opérations suivantes :
Levée d’un objet d’un type répertorié dans la spécification d’exception ou d’un objet de n’importe quel type, si le programme appelle directement le gestionnaire d’exceptions inattendues.
Levée d’un objet de type bad_exception.
Appel de fin,
abort
ouexit
.
Au démarrage du programme, le gestionnaire d’exceptions inattendues est une fonction qui appelle terminate.
Exemple
Consultez set_unexpected pour obtenir un exemple d’utilisation de unexpected
.