Comprendre __try, try/catch/finally en C
En C , les blocs try/catch/finally sont généralement utilisés pour la gestion des exceptions . Cependant, il existe une syntaxe alternative avec des traits de soulignement doubles, __try, qui est spécifique à Windows.
Quand utiliser __try
Sous Windows, la gestion des exceptions est implémentée via Structured Gestion des exceptions (SEH). Lorsque vous ciblez Windows avec des compilateurs MSVC, la syntaxe __try peut être utilisée pour intercepter les exceptions SEH.
Exceptions SEH et C
Le compilateur MSVC génère du code qui mappe les exceptions C aux l'infrastructure SEH, en utilisant le code d'exception 0xe06d7363 (« msc »). Cela permet aux destructeurs C d'être appelés lorsqu'une exception SEH est levée.
Optimisation du compilateur pour les destructeurs
Le compilateur MSVC optimise le code pour éviter de générer le code des destructeurs s'il y a aucune instruction throw pendant la durée de vie de l'objet. Cette optimisation peut être supprimée en utilisant l'option de compilation /EHa, qui est nécessaire pour intercepter toutes les exceptions SEH de manière cohérente.
Types d'exceptions SEH
SEH a de nombreux types d'exceptions, y compris ceux définis par le système d’exploitation et ceux utilisés par des applications spécifiques. Les exceptions gérées, telles que les exceptions .NET, utilisent le code d'exception 0xe0434f4d ("com").
__try, __sauf et __finally
Pour intercepter les exceptions SEH, __try est utilisé conjointement avec __sauf, qui agit comme un bloc catch C mais avec plus de fonctionnalités. __finally permet au code d'être exécuté après la gestion des exceptions.
Exemple de code
Le code fourni démontre l'utilisation de __try, __sauf et __finally pour intercepter les deux exceptions SEH. (causée par l'accès à un pointeur nul) et exceptions C (causées par le lancement d'un entier).
Le résultat montre que les destructeurs sont appelés pour les deux exceptions et que __sauf intercepte avec succès les exceptions.
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!