Code non managé Visual C ++: Utiliser / EHa ou / EHsc pour les exceptions C ++?
Si je crée un nouveau projet en C++, Visual Studio 2008 ou plus, qui la gestion des exceptions est le modèle que je veux aller avec?
Je comprends que l'option de /EHa des résultats en moins de code efficace, et aussi des captures SEH exceptions, non?
Donc, j'ai été directeur claire de l'option, et généralement avec /EHsc, de sorte que je suis le seul à en attraper les exceptions C++ qui sont en fait des jetés et non pas d'attraper des violations d'accès et d'autres structuré execptions, dans catch(...) les gestionnaires. Si il y a une violation d'accès dans mon code, je ne veux pas qu'il soit masqué par un catch(...) {}.
Je code avec d'autres personnes qui veulent catch(...) {} pour ne rien faire et ils veulent le faire si il y a une violation d'accès, ce qui semble être une très mauvaise idée pour moi. Si il y a un bug à cause du mauvais codage, vous ne voulez pas de coller vos doigts dans vos oreilles et dire haut et fort "La La La la la!", de sorte que vous n'avez pas à avoir le plantage du programme? En effet, si le code est présent dans un mauvais état à cause d'une erreur de codage, voulez-vous vraiment le code de continuer?
Donc ma pensée générale est que /EHa crée plus lent, code et il permet aux programmeurs de s'en tirer avec l'écriture de code que si une erreur de bug est présent, il continuera à fonctionner dans un état indéfini.
BTW, je parle d'applications et le code de service qui est ce que nous avons écrit pour la plupart. Pas de faible niveau de pilotes de périphérique ou quelque chose comme ça.
Veuillez peser avec vos pensées.
source d'informationauteur MarkS
Vous devez vous connecter pour publier un commentaire.
/EHa fait deux choses. Tout d'abord, il supprime une optimisation qui omet exception des filtres automatiquement appeler les destructeurs de locaux de variables de classe si le code de l'analyseur ne peut pas voir le code susceptible de jeter de l'une des exceptions C++. Cela rend le déroulement de pile sécuritaire pour tout type d'exception, pas seulement des exceptions C++. Les frais généraux de ces filtres d'exception est temps sur x86 et de l'espace sur les versions x86 et x64.
Et oui, il modifie le comportement de catch(...), il est maintenant aussi des filtres tout SEH exception, non seulement C++. C'est en effet un pari parce que vous attraper tous les vraiment des trucs méchants, asynchrone matériel exceptions. Bien que personnellement, je ne pense pas que la capture de toutes les exceptions C++ est très défendable, vous avez toujours, mais une vague idée dans quelle mesure le programme d'état a obtenu muté et pourquoi elle a échoué.
De façon réaliste, vous aurez besoin de passer à l'utilisation
__try/__except
de sorte que vous pouvez écrire votre propre filtre d'exception et d'éviter d'attraper les méchants. Le code d'exception pour les exceptions C++ est 0xe04d5343 ("MSC"). À l'aide de _set_se_translator() serait une autre approche.- Je utiliser /EHa parce qu'il est sûr .NET interop , alors que /EHsc peut-être pas; voir Les destructeurs pas appelé lorsque natif (C++) exception se propage à CLR composant par exemple.
Toutefois, si, pour un bit spécifique de code de la performance supplémentaire qui compte vraiment, et vous n'avez pas besoin .NET (ou autre chose) de compatibilité, c'est sûr que, /EHsc sonne bien.
Ni /EHsc ni /EHa prendre la plupart des erreurs de mémoire, de sorte que l'utilisation de ces attraper des violations d'accès est un cas désespéré.