J'ai une application assez grande qui charge dynamiquement des objets partagés et exécute du code dans l'objet partagé. Par précaution, je mets un try/catch à peu près tout dans main
. J'ai créé un crochet pour 3 choses: myException
(une exception interne), std::exception
, et ...
(intercepter toutes les exceptions).
Dans le cadre de l'exécution des objets partagés, de nombreux pthreads
sont créés. Lorsqu'un thread lève une exception, il n'est pas intercepté par main
. Est-ce le comportement standard? Comment puis-je intercepter toutes les exceptions, quel que soit le thread à partir duquel elles sont lancées?
Est-ce que main () interceptera les exceptions levées à partir des threads?
Non
Lorsqu'un thread lève une exception, il n'est pas intercepté par main. Est-ce le comportement standard?
Oui, c'est un comportement standard.
Pour intercepter une exception provenant du thread X
, vous devez avoir la clause try
-catch
dans le thread X
(par exemple, autour de tout dans le thread , comme pour ce que vous faites déjà dans main
).
Pour une question connexe, voir Comment puis-je propager des exceptions entre les threads?
Votre question demande quelque chose qui n'est pas conceptuellement possible.
Les blocs try sont définis comme des constructions dynamiques de la pile. Un bloc try intercepte les exceptions levées par le code atteint dynamiquement, par appel, à partir de son contenu.
Lorsque vous créez un nouveau thread, vous créez une toute nouvelle pile, qui ne fait pas du tout partie du contexte dynamique du bloc try, même si l'appel à pthread_create se trouve à l'intérieur du try.
Non, main n'acceptera pas les exceptions levées à partir d'autres threads. Vous devez utiliser une fonction spécifique à la plate-forme non standard qui traite les exceptions non gérées afin d'agréger la gestion de la manière que vous décrivez.
Lorsque je crée de telles applications, je m'assure que chaque objet actif possède son propre bloc de gestion des exceptions de niveau supérieur, précisément pour empêcher l'explosion de l'application entière en cas de défaillance d'un thread. À l'aide d'une capture spécifique à la plate-forme, je pense que tout votre code/solution globale est bâclé. Je n'utiliserais pas une telle chose.
Considérez que lever une exception déroule la pile. Chaque thread a sa propre pile. Vous devrez placer un bloc try/catch dans chaque fonction de thread (c'est-à-dire au point d'entrée de chaque thread).