Maison >développement back-end >C++ >Comment fonctionne la gestion structurée des exceptions (SEH) en C avec __try et try/catch/finally ?
Gestion structurée des exceptions (SEH) en C avec __try et try/catch/finally
En C , le try/catch/finally bloque fournir un mécanisme pour gérer les exceptions dans un bloc de code. Cependant, sous Windows, le compilateur prend également en charge une approche différente appelée Structured Exception Handling (SEH).
Le mot-clé __try est un mot-clé non standard qui vous permet d'intercepter les exceptions SEH. Les exceptions SEH sont prises en charge au niveau du système d'exploitation, ce qui permet d'intercepter les exceptions du système d'exploitation lui-même ou du code qui utilise SEH pour la gestion des exceptions.
Le mot clé __sauf vous permet de spécifier une expression de filtre d'exception qui détermine si ou non, une exception active doit être interceptée. Cela vous permet de gérer de manière sélective certains types d'exceptions.
Le mot-clé __finally vous permet d'ajouter du code qui s'exécute après la gestion de l'exception. Cela peut être utile pour effectuer des actions de nettoyage, telles que libérer des ressources ou fermer des fichiers.
Les exceptions SEH sont implémentées en plus des exceptions C. Les exceptions C sont levées à l'aide du mot-clé throw et peuvent être interceptées à l'aide du mot-clé catch. Lorsqu'une exception C est levée, le compilateur crée une exception SEH correspondante qui peut être interceptée par les blocs __try/__sauf.
L'option de compilation EHa force le compilateur à toujours générer du code pour enregistrer les destructeurs des objets créés. dans le cadre d’un bloc try. Cela garantit que les destructeurs sont appelés même en présence d'exceptions SEH asynchrones.
Pour démontrer comment les exceptions SEH peuvent être interceptées en C , considérez le programme suivant :
class Example { public: ~Example() { std::cout << "destructed" << std::endl; } }; int filterException(int code, PEXCEPTION_POINTERS ex) { std::cout << "Filtering " << std::hex << code << std::endl; return EXCEPTION_EXECUTE_HANDLER; } void testProcessorFault() { Example e; int* p = 0; *p = 42; } void testCppException() { Example e; throw 42; } int main() { __try { testProcessorFault(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } __try { testCppException(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; }
Lorsque vous exécutez ceci programme avec l'option de compilation EHa définie, la sortie montrera que les destructeurs des objets Exemples sont appelés, même lorsque des exceptions SEH sont levées. Cela montre comment les exceptions SEH et C peuvent être gérées ensemble dans le code C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!