Question

Si je crée un nouveau projet dans C ++ non géré, Visual Studio 2008 ou plus, quel modèle de gestion des exceptions que je veux aller avec?

Je comprends que l'option / EHA résultats dans le code moins efficace, et les prises également des exceptions SEH, droit?

J'ai été Evitant de cette option et va généralement avec / EHsc, de sorte que je n'attrapant les exceptions de C qui sont effectivement jetés et ne pas attraper des violations d'accès et d'autres execptions structurés, des prises (...) gestionnaires . S'il y a une violation d'accès dans mon code, je ne veux pas qu'il soit masqué par un catch (...) {}.

Code I avec d'autres qui veulent catch (...) {} pour ne rien faire et ils veulent même à le faire s'il y a une violation d'accès, ce qui semble être une très mauvaise idée pour moi. S'il y a un bug à cause du mauvais codage, vous ne voulez pas coller vos doigts dans vos oreilles et dire haut et fort « La la la la la! » de sorte que vous ne devez pas avoir le plantage du programme? En fait, si le code est maintenant en mauvais état en raison d'une erreur de codage, voulez-vous vraiment le code de continuer?

Alors ma pensée générale est que / EHa crée un code plus / moins rapide et il permet aux programmeurs de sortir avec le code écrit que si un bogue fatal est présent, il continuera de fonctionner dans un état indéfini.

BTW, je parle des applications et le code de service qui est ce que nous écrivons pour la plupart. Non faible niveau des pilotes de périphériques ou quelque chose comme ça.

S'il vous plaît peser vos pensées.

Était-ce utile?

La solution

/ EHa fait deux choses. Tout d'abord, il supprime une optimisation qui omet les filtres d'exception qui appellent automatiquement les Destructeurs des variables de classe locale si l'analyseur de code ne peut pas voir tout code qui pourrait lancer une exception C ++. Cela rend le déroulement enclinables sécurement pour tout type d'exception, non seulement une exception C ++. Frais généraux pour ces filtres d'exception est temps x86 et de l'espace sur x86 et x64.

Et oui, il modifie le comportement de la capture (...), maintenant filtre également une exception SEH, non seulement C ++. Ceci est en effet un pari parce que vous attrapez tous les trucs vraiment méchant, les exceptions matérielles asynchrones. Bien que je ne pense pas personnellement que la capture tous C ++ exceptions est soit très défendable, vous avez encore une vague idée, mais dans quelle mesure l'état du programme et avez été mutées pourquoi il a échoué.

De façon réaliste, vous devrez passer à l'aide __try/__except afin que vous puissiez écrire votre propre filtre d'exception et éviter d'attraper les mauvais. Le code d'exception pour les exceptions C est 0xe04d5343 ( "MSC"). L'utilisation _set_se_translator () serait une autre approche.

Autres conseils

J'utilise / EHa parce qu'il est en sécurité avec Interop .NET, alors que / EHsc peut ne pas être; voir pas appelé quand natif (C ++) exception se propage vers le composant CLR par exemple.

Cependant, si un bit de code spécifique de ces performances est vraiment important et vous n'avez pas besoin .NET (ou tout autre chose) la compatibilité, alors que, / EHsc sonne bien.

Ni / EHsc ni / EHa prises plupart des erreurs de mémoire, afin d'utiliser ces violations d'accès de capture est un cas désespéré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top