Ausnahmespezifikation
Ausnahmespezifikationen sind eine Sprachfunktion in C++, die in C++0x veraltet ist.Sie wurden entwickelt, um zusammenfassende Informationen dazu zu bieten, welche Ausnahmen aus einer Funktion heraus ausgelöst werden können, in der Praxis wurden sie als problematisch gefunden.In einer besonders nützlichen Ausnahmespezifikation befand sich die Throw-Spezifikation ().Beispiel:
void MyFunction(int i) throw();
weist den Compiler an, dass die Funktion keine Ausnahmen auslöst.Dies entspricht der Verwendung von __declspec (nothrow).Seine Verwendung wird als optional erachtet.In C++0x wird der noexcept-Operator eingegeben, jedoch Unterstützung für diese Funktion ist noch nicht in Visual C++ ab Visual Studio 2012 vorhanden.
Visual C++ folgt bei der Implementierung von Ausnahmespezifikationen nicht dem ANSI-Standard.In der folgenden Tabelle wird die Implementierung von Ausnahmespezifikationen in Visual C++ zusammengefasst.
Ausnahmespezifikation |
Bedeutung |
---|---|
throw() |
Die Funktion löst keine Ausnahme aus.Wenn jedoch eine Ausnahme von einer mit throw() markierten Funktion ausgegeben wird, erfolgt vom Visual C++-Compiler kein unerwarteter Aufruf (siehe unexpected (CRT) und unexpected (<exception>) für weitere Informationen.)Wenn eine Funktion mit throw () gekennzeichnet ist, geht der Visual C++-Compiler davon aus, dass die Funktion keine C++-Ausnahmen auslöst und entsprechenden Code generiert.Aufgrund der Code-Optimierungen, die möglicherweise vom C++-Compiler ausgeführt werden (auf Grundlage der Annahme, dass die Funktion keine C++-Ausnahmen auslöst), wenn eine Funktion eine Ausnahme auslöst, wird das Programm möglicherweise nicht ordnungsgemäß ausgeführt. |
throw(...) |
Die Funktion kann eine Ausnahme auslösen. |
throw(type) |
Die Funktion kann eine Ausnahme des Typs type auslösen.Allerdings wird dies in Visual C++ .NET als trow(...) interpretiert.Weitere Informationen erhalten Sie unter Funktionsausnahmebezeichner. |
Wenn die Ausnahmebehandlung in einer Anwendung verwendet wird, muss es eine oder mehrere Funktionen geben, die ausgelöste Ausnahmen behandeln.Alle Funktionen, die zwischen derjenigen, die eine Ausnahme auslöst, und diejenigen, die die Ausnahme behandelt, aufgerufen werden, müssen zum Auslösen der Ausnahme in der Lage sein.
Das Throw-Verhalten einer Funktion hängt von den folgenden Faktoren ab:
Ob Sie die Funktion mit C oder C++ kompilieren.
Welche /EH-Compileroption Sie verwenden.
Ob Sie explizit die Ausnahmespezifikation angeben.
Explizite Ausnahmespezifikationen sind für C-Funktionen nicht zulässig.
In der folgenden Tabelle wird das Auslösungsverhalten einer Funktion zusammengefasst:
Funktion |
/EHsc |
/EHs |
/EHa |
/EHac |
---|---|---|---|---|
C-Function |
throw() |
throw(...) |
throw(...) |
throw(...) |
C++-Funktion ohne Ausnahmespezifikation |
throw(...) |
throw(...) |
throw(...) |
throw(...) |
C++-Funktion ohne Ausnahmespezifikation throw() |
throw() |
throw() |
throw(...) |
throw(...) |
C++-Funktion mit Ausnahmespezifikation throw(...) |
throw(...) |
throw(...) |
throw(...) |
throw(...) |
C++-Funktion mit Ausnahmespezifikation throw(type) |
throw(...) |
throw(...) |
throw(...) |
throw(...) |
Beispiel
// 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();
}