HowTo: Exceptions global abfangen



  • Manchmal ist es nützlich, Exceptions die nicht abgefangen wurden global zu fangen. (z.B. kann man so einen Dialog aufbauen der dies mit Zusatzinformationen versendet oder rein zur Fehlersuche verwenden).

    Hier ein Beispiel, wie man das anstellen kann:

    static void Application_ThreadException(System::Object^ sender, System::Threading::ThreadExceptionEventArgs ^e)
    {
    	System::String^ errorMsg = System::DateTime::Now.ToString();
    
    	errorMsg += System::Reflection::Assembly::GetExecutingAssembly()->GetName()->Name + " Version ";
    	errorMsg += System::Reflection::Assembly::GetExecutingAssembly()->GetName()->Version->ToString() + "\r\n"; 
    	errorMsg += "\r\n\r\n" +  e->Exception->Message + "\r\n\r\nStack Trace:\r\n" + e->Exception->StackTrace ;
    	errorMsg += "\r\n\r\nFunktion: " + e->Exception->TargetSite;
    	errorMsg += "\r\n\r\nTyp: " + e->Exception->GetType()->ToString() + "\r\n\r\nSource: " + e->Exception->Source;
    
    	MessageBox::Show(errorMsg);
    }
    

    In der main einfügen:

    Application::ThreadException += gcnew System::Threading::ThreadExceptionEventHandler(
    		&Application_ThreadException);
    
    int main(array<System::String ^> ^args)
    {
    	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    
             // Eintragen des Exceptionhandlers
    	Application::ThreadException += gcnew System::Threading::ThreadExceptionEventHandler(
    		&Application_ThreadException);
    
    	// Hauptfenster erstellen und ausführen
    	Application::Run(gcnew Form1());
    	return 0;
    }
    

    (Damit bekommt man aber keine Exceptions gefangen die beim Laden des Projektes geworfen werden)

    [Edit]
    Das ist KEIN Ersatz um Fehler richtig abzufangen!
    [/Edit]