9
votes

Manipulation d'exception globale en C ++

Puis-je implémenter la manutention d'exception globale en C ++? Mes exigences sont essentielles ... Le bloc de capture n'est pas utilisé dans un morceau de code, puis il devrait y avoir un gestionnaire d'exception global qui gérera toute l'exception non capturée.

Puis-je y parvenir, veuillez donner votre précieuse suggestion :)


4 commentaires

Il n'y a pas d'essayer ... des blocs de capture en C de toute façon. Pensez-vous que c ++ peut-être?


Merci Karl, je l'ai changé à C ++.


Ce thread du forum MSDN pourrait fournir quelques liaisons utiles: SOCIAL.MSDN.MICROSOFT.COM /FORUMS/EN-US/VCGENERAL/TRAND/...


Avez-vous juste besoin d'attraper des exceptions c ++ ou des erreurs système, telles que les violations d'accès?


5 Réponses :


5
votes

Vous pouvez utiliser une combinaison de set_terminate et actuel_exception ()


2 commentaires

Vous devriez donner un exemple. Cette réponse aborde la question la plus utilement utile.


Vérifiez ma réponse pour un exemple. | ping @chriswatts



4
votes

en C ++ la fonction Terminez est appelée lorsqu'une exception est imprévue. Vous pouvez installer votre propre gestionnaire de terminaison avec la fonction set_terminate . L'inconvénient est que votre responsable de terminaison ne peut jamais revenir; Il doit résilier votre programme avec une primitive du système d'exploitation. La valeur par défaut est juste d'appeler avortement ()


2 commentaires

Désolé mais je suis un programmeur C #. Donc, si vous pouvez donner un exemple de code pour que cela puisse m'aider. Merci d'avance :)


@Deviprasaddas Cplusplus.com/reference/Exception/set_terminate a un exemple. std :: set_terminate (myTerminate); où le myteriminate () est juste une fonction vide



0
votes

Lorsqu'une exception est soulevée, si elle n'est pas prise à ce stade, elle monte la hiérarchie jusqu'à ce qu'elle soit effectivement prise. S'il n'y a pas de code pour gérer l'exception, le programme se termine.
Vous pouvez exécuter un code spécifique avant de terminer le nettoyage en utilisant vos propres gestionnaires de set_unexpected ou set_terminate


1 commentaires

Pour cela et toutes les autres réponses sur Set_Terminate: Si l'exception n'est pas traitée dans le bloc de capture, le processus prendra toujours terminer.



8
votes

J'enveloppe toujours la fonction la plus externe dans une capture essentielle comme ceci: xxx

Cela attrapera tout. Une bonne exception manipulation en C ++ ne consiste pas à écrire tout ce qui est d'essayer, mais à attraper où vous savez comment le gérer (comme vous semblez vouloir faire). Dans ce cas, la seule chose à faire est d'écrire le message d'erreur à STDRERR afin que l'utilisateur puisse agir dessus.


11 commentaires

Daniel, il existe plusieurs types d'exception qui ne sont pas attrapés par Catch (...) spécialement si vous utilisez VC ++ qui différencie entre la manipulation des exceptions structurées et non structurées.


Mais ce ne sont pas des exceptions c ++. (et les erreurs équivalentes de Linux ne sont pas attrapées par un essai / capture non plus)


Eh bien, l'affiche a seulement dit qu'il utilisait C ++. Il n'y avait aucune mention des spécificités de la plate-forme.


Ce n'est pas un gestionnaire d'exception global. Par exemple, cette technique ne fonctionne pas lors de l'utilisation de code C ++ d'une autre langue. Ainsi, je ne pense pas que cela réponde à la question.


@ user239558 Il n'y avait aucune mention d'une autre langue.


C'est exactement ce que nous voulons éviter; Avoir le code que vous avez raisonné sur Trapped à l'intérieur d'une déclaration d'exception rend difficile la raison d'elle; Cela conduit à la création de fonctions extérieures qui divisent à son tour votre flux de code et vous permet de sauter sur votre code pour voir ce que fait quoi au lieu d'avoir un bon débit linéaire. Un gestionnaire garderait la principale se concentrer sur faire des choses principales; Le principal devrait avoir aucune idée de quelle exception est.


@DMitry quand est une exception non capturée un "bon débit linéaire"? Désolé si j'ai mal compris ...


@ Daniellidström Je veux toujours l'attraper, mais je veux déplacer le gestionnaire des exceptions de la principale dans une autre fonction; Par exemple, au début de la principale ont une fonction comme "std :: gérer_all_exceptions_utilisateur_this_callback (CB);" Lorsque toute exception qui se produirait dans la principale serait traitée quelque part dans un autre rappel, ce qui peut s'inquiéter des exceptions.


@DMitry, puis voir par exemple MSDN.MicRosoft.com/en-us/Library/ ac9f67ah.aspx


@ 23w Voir Stackoverflow.com/a/7272147/2866406 pour obtenir de l'aide dans votre cas.


@ Daniellidström, merci je sais à ce sujet. Je voulais dire que cette réponse ne peut pas gérer cette situation.



2
votes

Je voulais faire la même chose, voici ce que je suis venu avec xxx

  • En plus de vérifier quoi (), il vérifie également ERNNO / STD :: strError () - à l'avenir, j'ai l'intention d'ajouter des traces de pile aussi bien via EXEINFO / BackTrace () TOO

  • Le attrape (...) est au cas où quelqu'un a jeté autre chose que d'exception .. Par exemple lancer 1; (lancer int: |) < / p>


2 commentaires

Merci @hanshenrik, c'est très utile. On dirait que vous avez une erreur de syntaxe sur cette première ligne. Je n'ai pas utilisé Set_terminate avant donc je l'apprécierais si vous pouvez le réparer.


@Kellystevens non, je pense que c'est bien, c'est ce qu'on appelle une "Fonction Lambda", elle nécessite C ++ 11 ou plus récente (il ne fonctionnera donc pas avec C ++ 03 compilateurs, par exemple), vérifiez wandbox.org/permlink/mtai7orwogrbmx