Spécifications d'exception
Les spécifications d'exceptions sont la fonctionnalité de langage C++ qui est déconseillée C++0x dans.Elles ont été conçues pour fournir des informations résumées sur les exceptions peuvent être levées en dehors d'une fonction, mais en pratique elles se sont avérées problématiques.L'une spécification d'exception qui s'est avéré quelque peu utile est la spécification de throw().Par exemple :
void MyFunction(int i) throw();
indique au compilateur que la fonction ne lève pas d'exception.c'est l'équivalent à utiliser __declspec (nothrow).Son utilisation est considérée comme facultative.C++0x dans, l'opérateur d' noexcept est présenté, mais la prise en charge de cette fonctionnalité n'est pas toujours présent dans Visual C++ as of Visual Studio 2012.
Visual C++ s'éloigne de la norme ANSI dans son implémentation des spécifications d'exception.Le tableau suivant résume l'implémentation de Visual C++ des spécifications d'exception :
Spécification d'exception |
Signification |
---|---|
throw() |
La fonction ne lève pas d'exception.Toutefois, si une exception est levée en dehors de throw() marquées par fonction, le compilateur Visual C++ n'appelle pas inattendu (voir unexpected (CRT) et l' unexpected (<exception>) pour plus d'informations).Si une fonction est identifiée par throw(), le compilateur Visual C++ supposera que la fonction ne lève pas d'exceptions C++ et ne génère pas de code en conséquence.En raison de les optimisations de code qui peuvent être exécutées par le compilateur C++ (basées sur l'hypothèse que la fonction ne lève pas d'exception C++) si une fonction lève une exception, le programme peut ne pas s'exécuter correctement. |
jet (...) |
La fonction peut lever une exception. |
jet (type) |
La fonction peut lever une exception de type type.Toutefois, dans Visual C++ .NET, il est interprète comme jet (...).Consultez spécificateurs d'exception de fonction. |
Si la gestion des exceptions est utilisée dans une application, il doit exister une ou plusieurs fonctions qui gèrent les exceptions levées.Lorsque est appelé entre celui qui lève une exception et celle qui gère l'exception doit être capable de lever l'exception.
Le comportement de jet d'une fonction dépend de facteurs suivants :
Si vous compilez la fonction sous C ou C++.
L'option du compilateur de /EH vous utilisez.
Si vous spécifiez explicitement la spécification de l'exception.
Il n'autorise pas les spécifications explicites d'exceptions sur les fonctions C.
Le tableau suivant résume le comportement de jet d'une fonction :
Fonction |
/EHsc |
/EHs |
/EHa |
/EHac |
---|---|---|---|---|
Fonction C |
throw() |
jet (...) |
jet (...) |
jet (...) |
Fonction C++ sans la spécification d'exception |
jet (...) |
jet (...) |
jet (...) |
jet (...) |
Fonction C++ avec la spécification d'exception throw() |
throw() |
throw() |
jet (...) |
jet (...) |
Fonction C++ avec la spécification d'exception de jet (...) |
jet (...) |
jet (...) |
jet (...) |
jet (...) |
Fonction C++ avec la spécification d'exception de jet (type) |
jet (...) |
jet (...) |
jet (...) |
jet (...) |
Exemple
// exception_specification.cpp
// compile with: /EHs
#include <stdio.h>
void handler() {
printf_s("in handler\n");
}
void f1(void) throw(int) {
printf_s("About to throw 1\n");
if (1)
throw 1;
}
void f5(void) throw() {
try {
f1();
}
catch(...) {
handler();
}
}
// invalid, doesn't handle the int exception thrown from f1()
// void f3(void) throw() {
// f1();
// }
void __declspec(nothrow) f2(void) {
try {
f1();
}
catch(int) {
handler();
}
}
// only valid if compiled without /EHc
// /EHc means assume extern "C" functions don't throw exceptions
extern "C" void f4(void);
void f4(void) {
f1();
}
int main() {
f2();
try {
f4();
}
catch(...) {
printf_s("Caught exception from f4\n");
}
f5();
}