Final logró controlador de excepción en una mezcla de nativos/archivo ejecutable administrado?

StackOverflow https://stackoverflow.com/questions/8704

Pregunta

Tengo una aplicación MFC compilado con /clr y estoy tratando de implementar un final controlador para lo contrario de la onu-atrapado administrado excepciones.Para los nativos de excepciones, anulando CWinApp::ProcessWndProcException obras.

Los dos eventos recomendados en Jeff CodeProject artículo,Application.ThreadException y AppDomain.CurrentDomain.UnhandledException, no se plantean.

Puede alguien sugerir una manera de proporcionar una final logró controlador de excepción para una mezcla ejecutable?


Actualización:

Parece que estos controladores de excepciones, sólo se desencadenan aguas abajo de Application.Run o similares (hay un subproceso de trabajo sabor, no recuerdo el nombre.) Si realmente quiere a nivel mundial atrapar una excepción administrada usted necesita para instalar un SEH filtro.No vas a conseguir un System.Exception y si quieres una pila de llamadas que usted va a tener que rodar su propio walker.

En un foro MSDN pregunta sobre este tema se sugirió reemplazar lo suficientemente baja de punto a nivel de los principales MFC hilo en un try ... catch (Exception^).Por ejemplo, CWinApp::Run.Esta puede ser una buena solución, pero no he mirado en cualquier perf o repercusiones sobre la estabilidad.Usted obtendrá una oportunidad para iniciar sesión con una pila de llamadas antes de fianza y puede evitar el defecto de windows unahndled comportamiento de excepción.

¿Fue útil?

Solución

Echando un vistazo alrededor de la internet, usted encontrará que usted necesita para instalar un filtro para obtener el no administrado excepciones de pasar los filtros en su camino a su dominio de aplicación.De El CLR y la Excepción no Controlada Filtros:

El CLR se basa en la SEH filtro de excepción mecanismo para la captura de excepciones no controladas.

Otros consejos

El uso de los dos controladores de excepción que debe trabajar.

Qué "debe?"

Los eventos no se planteó la utilización de la siguiente:

extern "C" void wWinMainCRTStartup();

// managed entry point
[System::STAThread]
int managedEntry( void )
{
    FinalExceptionHandler^ handler = gcnew FinalExceptionHandler();

    Application::ThreadException += gcnew System::Threading::ThreadExceptionEventHandler(
                                        handler,
                                        &FinalExceptionHandler::OnThreadException);

    AppDomain::CurrentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(
                                                        handler,
                                                        &FinalExceptionHandler::OnAppDomainException);

    wWinMainCRTStartup();

    return 0;
}

// final thread exception handler implementation
void FinalExceptionHandler::OnThreadException( Object^ /* sender */, System::Threading::ThreadExceptionEventArgs^ t )
{
    LogWrapper::log->Error( "Unhandled managed thread exception.", t->Exception );
}

// final appdomain exception handler implementation
void FinalExceptionHandler::OnAppDomainException(System::Object ^, UnhandledExceptionEventArgs ^args)
{
    LogWrapper::log->Error( "Unhandled managed appdomain exception.", (Exception^)(args->ExceptionObject) );
}

BOOL CMyApp::InitInstance()
{
    throw gcnew Exception("test unhandled");
    return TRUE;
}

El uso de los dos controladores de excepción que debe trabajar.Estás seguro de que has añadido en un lugar donde van a ser llamados y configurado correctamente (es decir, en su aplicación administrado punto de entrada -- usted lo hacía, ¿verdad?)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top