Actualmente estoy trabajando para agregar excepciones y manejo de excepciones a mi aplicación OSS. Las excepciones han sido la idea general desde el principio, pero quería encontrar un buen marco de excepción y honestamente, comprender las convenciones de manejo de excepciones C++ y las expresiones idiomáticas un poco mejor antes de comenzar a usarlas. Tengo mucha experiencia con C# /. Net, Python y otros lenguajes que usan excepciones. No soy ajeno a la idea (pero lejos de ser un maestro).Mostrar información de depuración de excepciones a los usuarios
En C# y Python, cuando se produce una excepción no controlada, el usuario obtiene un buen seguimiento de la pila y, en general, una gran cantidad de
muy útil
información de depuración inestimable. Si está trabajando en una aplicación OSS, que los usuarios peguen esa información en los informes de problemas es ... bueno, digamos que me resulta difícil vivir sin eso. Para este proyecto de C++, obtengo "La aplicación se colgó", o de usuarios más informados, "Hice X, Y y Z, y luego se bloqueó". ¡Pero también quiero esa información de depuración!
Ya he (y con gran dificultad) he hecho las paces con el hecho de que nunca veré una forma multiplataforma y de compilación cruzada de obtener un seguimiento de la pila de excepción C++, pero sé que puedo obtener el nombre de la función y otra información relevante.
Y ahora quiero eso para mis excepciones no controladas. Estoy usando boost::exception, y tienen esta muy buena diagnostic_information thingamajig que puede imprimir el nombre de la función (sin marcar), el archivo, la línea y lo más importante, otra información específica de la excepción que el programador agregó a esa excepción.
Naturalmente, manejaré excepciones dentro del código cada vez que pueda, pero no soy tan ingenuo como para pensar que no dejaré pasar a un par (involuntariamente, por supuesto).
Lo que quiero hacer es ajustar mi punto de entrada principal dentro de un bloque try
con un catch
que crea un diálogo especial que informa al usuario que ha ocurrido un error en la aplicación, con información más detallada presentada cuando el usuario hace clic "Más" o "Información de depuración" o lo que sea. Esto contendría la cadena de diagnostic_information. Podría entonces instruir a los usuarios a pegar esta información en informes de problemas.
Pero una primera impresión molesta me dice que si se envuelve todo en un bloque try es una muy mala idea. ¿Es lo que voy a hacer estúpido? Si es (e incluso si no lo es), ¿cuál es la mejor manera de lograr lo que quiero?
+1, pero ¿es correcto llamar a algo no derivado de 'std :: exception' una excepción? ;-) (y no, no tengo un nombre mejor para int arrojado o algo igualmente afilado). –
¿Te refieres al 'catch (...)'? Solo lo tengo completo, si algo entra realmente en él, me sorprendería y buscaría quién está lanzando cosas al azar. – GManNickG
GMan, sí, veo tu intención, es solo que me pregunto si alguien dice "excepción desconocida" o "algo desconocido arrojado en nuestro camino" en este caso ;-) una cuestión de terminología. –