Question

Quels sont les points importants sur les exceptions structurées devraient tous les C ++ savoir développeur?

Était-ce utile?

La solution

Ils sont l'équivalent Win32 aux signaux Unix, et vous permettent d'intercepter des exceptions CPU tels que la violation d'accès, instruction illégale, division par zéro.

Avec les bonnes options du compilateur (/ EHa pour Visual C ++), C ++ exceptions utilisent le même mécanisme que le déroulement des travaux pile correctement pour les deux C ++ (utilisateur) exceptions et SEH (OS) exceptions.

Contrairement à C ++ exceptions, SEH ne sont pas typé mais tous partagent la même structure de données qui a un code d'exception (la cause) et des informations supplémentaires sur ce que le code en défaut et quels sont les registres CPU détenus au moment de la faute. Voir GetExceptionCode et GetExceptionInformation pour plus de détails à ce sujet.

En outre, SEH a "première chance" de manipulation, ce qui vous permet de vous connecter ou autrement gérer l'exception avant de vous relaxer Détruit toutes les variables locales.

Autres conseils

J'ai eu récemment un problème qui a été causé indirectement par SEH, en particulier en raison d'une caractéristique de SEH que je pense que chaque développeur doit être conscient:

Lorsque SEH est utilisé Destructeurs ne sont pas appelés, donc si vous avez un code de nettoyage dans votre destructor il ne sera pas nettoyé.

Notre problème a été causé par une section critique qui a été enveloppé par un objet avec la serrure dans le constructeur et déverrouiller dans le destructor.

Nous avons eu une situation de blocage et ne pouvait pas comprendre pourquoi, et après environ une semaine de creuser à travers le code et les décharges et le débogage nous avons finalement compris que c'était parce qu'il y avait une exception qui a été gérée par COM et provoquant la section critique pour rester bloqué. Nous avons changé un drapeau de compilation dans VS dans les propriétés du projet qui lui indiquent courir même pour SEH Destructeurs et qui a résolu le problème.

Donc, même si vous ne pouvez pas utiliser SEH dans votre code, vous pouvez utiliser une bibliothèque qui fait (comme COM) et qui peut provoquer un comportement inattendu.

Ils doivent savoir qu'ils ne font pas partie de la norme C ++ -. Ils sont Microsoft invention et peuvent être utilisés dans des langues autres que C ++

Un cours accéléré sur les Profondeurs de Win32 ™ Exception Gestion structurée

Cet article est référence à la vitesse de se lever avec SEH. 13 ans plus tard, est toujours le meilleur il est.

Il y a un sujet dédié sur MSDN pour SEH vs. C Différences de manipulation d'exception .

Certaines choses un développeur C ++ doit savoir si SEH est en discussion:

Écriture C / C ++ SEH Exception Handlers :

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

pas C ++ la gestion des exceptions, sont les extensions spécifiques pour MS accrochage droit SEH mal placé. Il fonctionne très différemment de votre exécution de l'usine- C ++ exceptions. Vous avez besoin d'une bonne compréhension de la SEH à utiliser ces derniers.

Écriture C / C ++ SEH résiliation Handlers :

__try {
   // guarded code
}
__finally ( expression ) {
   // termination code
}

Comme avec le gestionnaire de SEH, ne confondez pas avec la sémantique exception de C. Vous avez besoin d'une bonne compréhension de la SEH.

_set_se_trasnlator : c'est la fonction qui traduit les exceptions SEH dans les exceptions de type de C lorsque des exceptions asynchrones sont utilisées / EHa .

Et enfin, une opinion personnelle: si un développeur de savoir C ++ SEH? Après votre première recrue .ecxr vous comprendrez que lorsque la poussée viennent à pousser les exceptions C sont juste une illusion est à votre disposition. La seule chose se passe est SEH.

Un point important est de savoir quand utiliser SEH et quand utiliser C ++ standard exceptions. Tout d'abord, choisissez un seul système - systèmes de mélange tend à être problématique, ce qui nécessite une compréhension profonde des deux pour mettre en œuvre bien. En second lieu, à un niveau élevé, SEH ne se limite pas à C ++, alors que la norme C ++ exceptions ne sont pas limités à Windows. Si cela ne dicte pas votre décision, choisir des exceptions standards à moins qu'ils ne suffisent pas (voir les autres réponses pour plus de détails sur ce que SEH peut faire).

Une citation

scroll top