La situación es la siguiente: El subproceso A capta una excepción, guarda los datos de la excepción en algún lugar de la memoria (usando GetExceptionInformation en el filtro de excepción) y los posteriores el subproceso B obtiene esa información de excepción y desea volver a lanzarla. Pero la cuestión es que cuando el hilo B vuelve a lanzar la excepción detectada, me falta la pila de llamadas original que condujo a la excepción.
¿Cómo puedo volver a lanzar la excepción sin perder la pila de llamadas original? (tenga en cuenta que esta pregunta es sobre C++).¿Cómo volver a lanzar una excepción sin perder la pila de llamadas original?
Respuesta
Puede desenrollar la pila en el bloque catch y guardarla como parte de la excepción que está volviendo a lanzar. El desenrollado de la pila en C++ es un poco complicado, pero se puede echar un vistazo al código del colector crashdump que viene con WxWidgets para ver un ejemplo.
marcado como respuesta, aunque no del todo práctico en mi caso –
La pregunta es por qué necesitarías pasar la pila al hilo "recibir".
Supongo que necesita la pila para básicamente informarla a algún registro de errores. Puede caminar la pila en el hilo de captura, o producir un mini volcado, o cualquier información de error que desee recopilar, y luego simplemente pasar una copia de la excepción (si es posible, tenga cuidado con cortar) al hilo de recepción.
la excepción que atrapé dentro de una especie de rutina de tenedor-unión. así que si se lanza una excepción en algún hilo de trabajo, me gustaría pasarlo al hilo principal y volver a lanzarlo ahí (+ no quiero perder el montón original) –
- 1. Cómo volver a lanzar la excepción interna de una TargetInvocationException sin perder el seguimiento de la pila
- 2. En C#, ¿cómo puedo volver a lanzar InnerException sin perder el seguimiento de pila?
- 3. ¿Cómo puedo volver a lanzar una excepción que contiene información sobre una excepción original?
- 4. Cómo volver a lanzar una excepción
- 5. ¿Cómo puedo volver a lanzar una excepción en Javascript, pero conservar la pila?
- 6. En Python, ¿cómo inspecciono y luego vuelvo a levantar una excepción mientras mantengo la pila de llamadas original?
- 7. Excepción ReSharper volver a lanzar posiblemente destinado
- 8. Volver a lanzar una excepción de destino InvocationTargetException
- 9. ¿Lanzar una excepción sin detener la ejecución?
- 10. Cuándo volver a lanzar una excepción, cuándo devolver FALSO?
- 11. ¿Lanzar excepción al volver a asignar una constante en Ruby?
- 12. Lanzar excepción pero persistir el seguimiento de la pila
- 13. Control.EndInvoke restablece la pila de llamadas para la excepción
- 14. java: no se puede volver a lanzar una excepción: no controlada tipo de excepción Excepción
- 15. Conservación del seguimiento de la pila al volver a lanzar excepciones en Silverlight
- 16. ¿Lanzará C++ sin argumentos dentro de otro marco para volver a lanzar una excepción?
- 17. ¿Cómo puedo volver a lanzar una excepción interna mientras mantengo el seguimiento de pila generado hasta ahora?
- 18. Lanzar una nueva excepción al lanzar una excepción antigua
- 19. volver a subir a excepción de Python y preservar seguimiento de la pila
- 20. ¿Cómo puedo registrar la pila de llamadas con JCL sin utilizar elevar excepción
- 21. ¿Hay alguna manera de volcar un seguimiento de pila sin lanzar una excepción en java?
- 22. captura de excepciones, añadir datos y volver a lanzar que
- 23. Lanzar manualmente una excepción
- 24. ¿Por qué volver a lanzar excepciones?
- 25. de volver a intentar algo 3 veces antes de lanzar una excepción - en clojure
- 26. Prueba de conexión de SQL sin lanzar una excepción
- 27. cómo volver a lanzar la misma excepción en el servidor sql
- 28. Cómo volver a lanzar la excepción en AspectJ alrededor del consejo
- 29. Cómo lanzar una excepción matriz en PHP
- 30. ¿Cómo puedo lanzar una excepción en Clojure?
Solo quería asegurarme de que no obtuve las respuestas que son específicas para C#, por ejemplo :) –
Algunas de las soluciones son definitivamente específicas del lenguaje/plataforma. Las excepciones de C++ y C# difieren, y las excepciones de C++ se implementan de manera diferente en diferentes plataformas. –
Se describe una buena solución en este [subproceso de desbordamiento de pila] (http://stackoverflow.com/questions/23820633/gdb-prevent-losing-backtrace-in-a-catch-rethrow-situation) –