¿Captará main () las excepciones lanzadas desde los hilos?


Tengo una aplicación bastante grande que carga dinámicamente objetos compartidos y ejecuta código en el objeto compartido. Como precaución, puse un intento / captura alrededor de casi todo en main. Creé una captura para 3 cosas: myException (una excepción interna), std::exception, y ... (captura todas las excepciones).

Como parte de la ejecución de objetos compartidos, se crean muchos pthreads. Cuando un hilo lanza una excepción, no es capturado por main. Es este el comportamiento estándar? ¿Cómo puedo coger todas las excepciones, no ¿importa de qué hilo se lanzan?

Author: Guy Avraham, 2011-10-11

4 answers

¿Captará main() las excepciones lanzadas desde los hilos?

No

Cuando un hilo lanza una excepción, no es capturado por main. Es este el comportamiento estándar?

Sí, este es el comportamiento estándar.

Para atrapar una excepción que se origina en thread X, debe tener try-catch cláusula en thread X (por ejemplo, alrededor de todo en la función thread, de manera similar a lo que ya haces en main).

Para una pregunta relacionada, ver ¿Cómo puedo propagar excepciones entre hilos?

 30
Author: NPE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-16 00:35:44

Tu pregunta es pedir algo que no es conceptualmente posible.

Los bloques Try se definen como construcciones dinámicas de la pila. Un bloque try captura excepciones lanzadas por código alcanzado dinámicamente, por llamada, de su contenido.

Cuando creas un nuevo hilo, creas una pila completamente nueva, que no forma parte del contexto dinámico del bloque try, incluso si la llamada a pthread_create está dentro del try.

 14
Author: bmargulies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-11 18:16:27

No, main no captará las excepciones lanzadas desde otros hilos. Tendría que usar una instalación no estándar, específica de la plataforma que aborde las excepciones no controladas para agregar el manejo de la manera que está describiendo.

Cuando compilo tales aplicaciones, me aseguro de que cada objeto activo tenga su propio bloque de manejo de excepciones de nivel superior, precisamente para evitar que toda la aplicación explote si falla un subproceso. El uso de una plataforma específica de captura todo lo que creo que ruega por su código / solución general para ser descuidado. Yo no usaría tal cosa.

 8
Author: Brent Arias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-11 18:15:15

Considere que lanzar una excepción desenrolla la pila. Cada hilo tiene su propia pila. Tendrá que colocar un bloque try / catch en cada función de subproceso (es decir, en el punto de entrada de cada subproceso).

 6
Author: Dabbler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-11 18:15:31