SEH-Beendigungsblöcke (C++)
Nach oben zu Strukturierte Exceptions unter Win32 (C++)
Das Modell der strukturierten Exception-Behandlung (Structured Exception Handling, SEH) unterstützt einen "Beendigungsblock", der ausgeführt wird, wenn ein überwachter Block normal oder über eine Exception verlassen wird. Der C++Builder-Compiler unterstützt dies in C mit der folgenden Syntax:
__try {
func();
}
__finally {
// this happens whether func() raises an exception or not
}
Beendigungsblöcke werden durch eine C++-Erweiterung unterstützt, wobei die Bereinigung im __finally-Block ausgeführt werden kann:
try {
func();
}
__finally {
// this happens whether func() raises an exception or not
}
Das folgende Beispiel illustriert Beendigungsblöcke:
/* Program results:
An exception:
Caught an exception.
The __finally is executed too!
No exception:
No exception happened, but __finally still executes!
*/
#include <stdio.h>
#include <windows.h>
int main() {
float e, f, g;
try {
f = 1.0;
g = 0.0;
try {
puts("An exception:");
e = f / g;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
puts("Caught an exception.");
}
}
__finally {
puts("The __finally is executed too!");
}
try {
f = 1.0;
g = 2.0;
try {
puts("No exception:");
e = f / g;
}
__except (EXCEPTION_EXECUTE_HANDLER) {
puts("Caught an exception.");
}
}
__finally {
puts("No exception happened, but __finally still executes!");
}
return e;
}
C++-Code kann einen "Beendigungsblock" auch durch Erstellen von lokalen Objekten mit Destruktoren behandeln, die beim Verlassen des Gültigkeitsbereichs aufgerufen werden. Da die strukturierten Exceptions von C++Builder die Destruktor-Bereinigung unterstützen, funktioniert dies unabhängig von Typ der ausgelösten Exception.
Hinweis: Ein Sonderfall bezieht sich auf Exceptions, die ausgelöst, aber nie vom Programm behandelt werden. Bei einer C++-Exception ruft der C++Builder-Compiler Destruktoren für lokale Objekte auf (wird von der Sprachdefinition nicht gefordert), während bei einer unbehandelten Win32-Exception keine Destruktor-Bereinigung durchgeführt wird.
Hinweis: Standard-C++ unterstützt keine
finally
-Blöcke. Die Freigabe von Ressourcen erfolgt in der Regel mithilfe von Destruktoren. Bei der Arbeit mit der VCL, die in der Sprache Delphi entwickelt wurde, sindfinally
-Blöcke aber ein wichtiges Werkzeug, da VCL-Objekte auf dem Heap zugewiesen werden.