SEH-Beendigungsblöcke (C++)

Aus RAD Studio
Wechseln zu: Navigation, Suche

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, sind finally-Blöcke aber ein wichtiges Werkzeug, da VCL-Objekte auf dem Heap zugewiesen werden.

Siehe auch