Mélange des exceptions standard et des exceptions structurées (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Exceptions structurées sous Win32 (C++)

Vous devez prendre conscience de certains problèmes quand vous utilisez des exceptions structurées dans des programmes C++. Bien que C++Builder implémente les exceptions C++ avec des exceptions structurées Win32, les exceptions C++ sont transparentes pour un bloc __except.

Un bloc try peut être suivi par un bloc except ou par au moins un bloc catch. Toute tentative de mélanger les deux provoque une erreur de compilation. Pour que du code puisse gérer les deux types d'exception, vous devez l'imbriquer dans deux blocs try :

 try {
 	EXCEPTION_POINTERS *xp;
 	try {
 		func();
 	}
 	__except (xfilter(xp = GetExceptionInformation())) {
 		// ...
 	}
 }
 catch (...) {
 	// ...
 }

La spécification throw() d'une fonction n'affecte pas le comportement d’un programme en ce qui concerne une exception Win32. En outre, une exception non gérée est finalement gérée par le système d'exploitation (si un débogueur ne la gère pas d'abord), à la différence d'un programme C++ qui appelle terminate().

Tout module compilé avec l'option de compilation -xd (activée par défaut) invoquera les destructeurs pour tous les objets avec le stockage automatique. Le déroulement de pile se produit depuis le point où l'exception est déclenchée jusqu'au point où elle est interceptée.

Exemple d'un programme C++ ayant des exceptions C

 /* Program results:
  Another exception:
  Caught a C-based exception.
  Caught C++ exception: Hardware error: Divide by 0 : 
  C++ allows __finally too!
  */
 #include <stdio.h>
 #include <string.h>
 #include <windows.h>
 
 class Exception {
 public:
 	Exception(char* s = "Unknown") {
 		what = strdup(s);
 	}
 
 	Exception(const Exception& e) {
 		what = strdup(e.what);
 	}
 
 	~Exception() {
 		delete[]what;
 	}
 
 	char* msg() const {
 		return what;
 	}
 
 private:
 	char* what;
 };
 
 int main() {
 	float e, f, g;
 	try {
 		try {
 			f = 1.0;
 			g = 0.0;
 			try {
 				puts("Another exception:");
 				e = f / g;
 			}
 			__except (EXCEPTION_EXECUTE_HANDLER) {
 				puts("Caught a C-based exception.");
 				throw(Exception("Hardware error: Divide by 0"));
 			}
 		}
 		catch (const Exception& e) {
 			printf("Caught C++ Exception: %s :\n", e.msg());
 		}
 	}
 	__finally {
 		puts("C++ allows __finally too!");
 	}
 	return e;
 }

Voir aussi