web-dev-qa-db-fra.com

Est-ce que main () interceptera les exceptions levées à partir des threads?

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?

35
steveo225

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?

46
NPE

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.

19
bmargulies

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.

9
Brent Arias

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).

7
Dabbler