Maison >développement back-end >C++ >Quel est le but et l'implémentation de __try en C sous Windows ?

Quel est le but et l'implémentation de __try en C sous Windows ?

DDD
DDDoriginal
2024-11-07 15:04:02141parcourir

What is the Purpose and Implementation of __try in C   on Windows?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn