2008-08-12 10 views
6

Ich habe eine MFC-Anwendung kompiliert mit/Clr und ich versuche, eine endgültige Handler für sonst nicht erfasste gemanagte Ausnahmen zu implementieren. Bei nativen Ausnahmen funktioniert das Überschreiben CWinApp::ProcessWndProcException.Endgültig verwalteter Ausnahmebehandler in einer gemischten nativen/verwalteten ausführbaren Datei?

Die beiden in Jeffs CodeProject article, Application.ThreadException und AppDomain.CurrentDomain.UnhandledException vorgeschlagenen Ereignisse werden nicht ausgelöst.

Kann jemand vorschlagen, einen endgültigen verwalteten Ausnahmebehandler für eine gemischte ausführbare Datei bereitzustellen?


Update:

Es scheint, dass diese Exception-Handler nur hinter Application.Run oder ähnliche ausgelöst werden (. Gibt es einen Worker-Thread Geschmack, kann nicht an den Namen erinnern) Wenn Sie wirklich global zu wollen, fängt eine Ausgenommene Ausnahme Sie müssen einen SEH-Filter installieren. Du wirst keine System.Exception bekommen und wenn du einen Callstack willst, musst du deinen eigenen Walker rollen.

In einer MSDN-Forumfrage zu diesem Thema wurde vorgeschlagen, einen ausreichend niedrigen Punkt des Haupt-MFC-Threads in einem try ... catch (Exception^) zu überschreiben. Zum Beispiel CWinApp::Run. Dies mag eine gute Lösung sein, aber ich habe keine Auswirkungen auf die Perfomance oder Stabilität untersucht. Sie erhalten die Möglichkeit, sich mit einem Call-Stack einzuloggen, bevor Sie eine Kaution erhalten, und Sie können das standardmäßige Windows-Ausnahmeverhalten vermeiden.

+0

Vielleicht würde es uns helfen, mehr über die Ausnahmen zu erfahren, die ausgelöst werden und die nicht von den beiden von Ihnen erwähnten Ereignissen erfasst werden? – Charlie

+0

Jede verwaltete Ausnahme überhaupt - jeder Erben von System :: Exception. Der Punkt der obigen Ereignisse besteht darin, auszulösen, wenn die/ave/managed-Ausnahme nicht abgefangen wird. –

Antwort

2

um die internets einen Blick nehmen, werden Sie, dass Sie einen Filter installieren finden die nicht verwalteten Ausnahmen vorbei an den Filter auf dem Weg zu erhalten, Ihre AppDomain. Von CLR and Unhandled Exception Filters:

:

Die CLR stützt sich auf den unbehandelten SEH-Ausnahmefiltermechanismus, um nicht behandelte Ausnahmen abzufangen.

0

Die Verwendung dieser beiden Ausnahmehandler sollte funktionieren. Sind Sie sicher, Sie haben sie an einem Ort hinzugefügt, wohin sie gehen werden genannt und richtig eingestellt (dh in Ihrer Anwendung verwaltet Einstiegspunkt - Sie setzen hat man in, nicht wahr?)

+0

Ich denke, das Problem ist, dass es nirgendwo Application.Run gibt. –

1

Die Verwendung dieser beiden Ausnahmehandler sollte funktionieren.

Warum "sollte?"

Die Ereignisse werden nicht mit der unten angehoben:

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