try tipo son que programacion las lanzamiento jerarquia instrucciones excepciones errores clases catch atrapar c++ mfc exception-handling

son - tipo de excepciones en c++



capturando una excepción desconocida (5)

A medida que especifique el uso de MFC, supongo que está trabajando con una versión de Visual Studio. Si este es el caso y puede ejecutar su programa en modo de depuración, puede configurar el depurador para romper con las excepciones no controladas. Esto requeriría quitar la parte de catch(...) de su código, pero debería irrumpir en el depurador en el punto correcto y proporcionarle información útil sobre la excepción en sí misma.

Lo remito a la documentación de Microsoft aquí y aquí .

En la versión de lanzamiento de mi código, una línea arroja una excepción y no sé qué tipo de excepción es, así que no puedo atraparla correctamente o resolver el problema.

Estoy usando el truco (...) pero eso es bastante inútil.

aquí hay un pseudo código

try { m_mmwIPC = gcnew NiftyIPC(gcnew String("Monitor"), true); } catch (CException* e) { TCHAR szCause[255]; e->GetErrorMessage(szCause, 255); CString errorStr = szCause; RemoveLineFeeds(errorStr); OutputDebugString(errorStr); } catch(...) { OutputDebugString(L"Unknown exception/n"); }

Entonces, ¿hay alguna forma de obtener detalles sobre la excepción desconocida lanzada? Solo un tipo sería genial.

Gracias


Cada excepción debe derivar de std::exception , luego puede usar RTTI. El bloque de captura estándar es

catch (const std :: exception & e) { // e .what (); // typeid (e); } catch (...) { // WTF ?!?!? }

En c ++ 0x puede usar std::current_exception y quizás pasar el exception_ptr en una biblioteca inteligente para su análisis.

Tenga en cuenta que las excepciones pueden ser buildins y otros tipos que no tienen RTTI, por lo que siempre debe derivar de std :: exception.


No aquí no es. catch (...) solo debería usarse como último recurso realmente.


Una opción es no detectar el error y ejecutar el programador en el depurador (esto es posible en el modo de lanzamiento). Visual Studio irrumpirá en el código donde ocurre la excepción no detectada.


No realmente, podría ser un int , un const char* o un RhubarbPie über-smart pointer.

Sin embargo:

  • Intenta capturar std::exception también. Eso atrapará muchas excepciones nativas de C ++.
  • Su excepción probablemente sea .NET, intente detectar esa, no la excepción Base de MFC. (Parece que está haciendo C ++ / CLI. En ese caso, las excepciones .NET terminan en la cláusula catch-all)
  • Además, las excepciones generalmente están destinadas a ser capturadas por referencia en C ++ ( Actualización: MFC aparentemente usa el método de lanzar y atrapar con el puntero. Eso también funciona, siempre que capte lo que se arroja ) .
  • También podría ser útil usar __try y __catch, ya que algunas excepciones de "hardware" como desbordamiento de pila, violación de acceso, etc., también son excepciones desconocidas en Windows. La sintaxis para capturarlos es un poco diferente, pero se obtiene un identificador de excepción que se puede utilizar para informar el tipo de excepción lanzada. Lo uso para imprimir los seguimientos de pila en errores fatales en nuestras aplicaciones.