Final réussi gestionnaire d'exception dans un mélange de maternelle et de gérer un exécutable?

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

Question

J'ai une application MFC compilé avec /clr et je suis en train de mettre en œuvre une finale gestionnaire d'ailleurs pris exceptions gérées.Pour les exceptions, substitution CWinApp::ProcessWndProcException des œuvres.

Les deux événements ont suggéré de Jeff CodeProject article,Application.ThreadException et AppDomain.CurrentDomain.UnhandledException, ne sont pas soulevées.

Quelqu'un peut-il suggérer un moyen d'offrir un final réussi gestionnaire d'exception pour un mélange de l'exécutable?


Mise à jour:

Il semble que ces gestionnaires d'exception sont déclenchés seulement en aval de Application.Run ou similaires (il y a un thread de travail saveur, ne peut pas se rappeler le nom.) Si vous voulez véritablement à l'échelle mondiale attraper une exception géré, vous devez installer un SEH filtre.Vous n'allez pas obtenir un System.Exception et si vous voulez une pile d'appels, vous allez devoir faire vos propres walker.

Dans un forum MSDN question sur ce sujet, il a été suggéré de remplacer un niveau suffisamment bas-niveau point de la principale MFC thread dans un try ... catch (Exception^).Par exemple, CWinApp::Run.Cela peut être une bonne solution, mais je n'ai pas regardé toute la perf ou la stabilité des implications.Vous aurez l'occasion de journal avec une pile d'appel à l'avant de la caution et vous pouvez éviter le défaut de windows unahndled comportement des exceptions.

Était-ce utile?

La solution

Prendre un coup d'oeil autour de l'internet, vous verrez que vous avez besoin pour installer un filtre pour obtenir les exceptions non gérées en passant les filtres sur leur chemin à votre domaine d'application.À partir de CLR et Exception non Gérée Filtres:

Le CLR s'appuie sur le SEH exception non gérée mécanisme du filtre à attraper les exceptions non gérées.

Autres conseils

À l'aide de ces deux gestionnaires d'exception devrait fonctionner.

Pourquoi "devrait?"

Les événements ne sont pas soulevée à l'aide de la ci-dessous:

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;
}

À l'aide de ces deux gestionnaires d'exception devrait fonctionner.Êtes-vous sûr que vous avez ajoutés dans un endroit où ils vont être appelés, et de définir correctement (c'est à dire, dans votre application géré point d'entrée -- vous avez mis en place, non?)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top