none
Globaler Exception Handling RRS feed

  • Frage

  • Hi Leute,

    wie bekomme ich es hin das ich eine Exception die nicht behandelt wurde über das Ganze Projekt Abfangen kann ?

    d.h wenn ich z.B. eine Exeption in meinem UserControl bekomme und sie nicht abfange steigt mein Programm aus, ich möchte dieses anber im MainWIndow abfangen und selber entscheiden ob und wie ich aussteige ! 

    grüße

    Klaus

     

     

     

     

     

     


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010
    Mittwoch, 9. Februar 2011 10:35

Antworten

  • Hi Klaus,

    grunz, das war allerdings missverständlich, denn es geht ja nicht um ein Window - sorry dafür. Gemeint ist das im XAML Deiner Application.xaml einleitende <Application ....>-tag. Dort kannst Du (übrigens auch per Intellisense - einfach mal Strg-Leertaste drücken) EventHandler definieren, die auf dem Application-Level gefeuert werden. Hier mal beispielhaft der Inhalt einer möglichen Application.xaml, in der der Handler hinterlegt ist:

    <Application x:Class="Application"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      DispatcherUnhandledException="Application_DispatcherUnhandledException"       
      StartupUri="IrgendeinWindow.xaml">
      <!-- ... -->
    </Application>
    
    

     

    Wenn Du das bei Dir per copy'n'paste einfügst, existiert allerdings in Deinem Code oben aufgeführte / genannte Event-Handler ("Application_DispatcherUnhandledException") natürlich nicht. Wenn Du aber im Xaml den Teil nach dem = entfernst und dann =" eingibst, sollte Intellisense Dir anbieten, den Handler im Code zu erzeugen. Dort dann den bereits geposteten Code einfügen.

    Oder, alternativ, einfach diesen (entsprechenden) Code einfügen:

    Private Sub Application_DispatcherUnhandledException( _
    			ByVal sender As System.Object, _
    			ByVal e As System.Windows.Threading.DispatcherUnhandledExceptionEventArgs)
    	Dim ex As Exception = e.Exception
    	MsgBox("Unbehandelter Fehler: " + ex.Message)
    	e.Handled=True
    End Sub
    
    


    Cheers,
    Olaf
    http://blogs.intuidev.com
    • Als Antwort markiert WPF_Klaus Dienstag, 15. Februar 2011 09:39
    Donnerstag, 10. Februar 2011 10:19

Alle Antworten

  • hallo Klaus

    vielleicht hilft dir als Orientierung der nachstehende Link:

    http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx

    Viele Grüße


    Michael Lutz, BITsoft
    Mittwoch, 9. Februar 2011 16:52
  • Hallo Michael,

     

    danke für denn Link

    Habe folgendes Probiert.

    Public Event UnhandledException As UnhandledExceptionEventHandler

    ....

     Dim currentDomain As AppDomain = AppDomain.CurrentDomain
            AddHandler currentDomain.UnhandledException, AddressOf Fehlerroutine

    .....

     Public Sub Fehlerroutine(ByVal sender As Object, ByVal args As UnhandledExceptionEventArgs)
            Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
            MsgBox("Unbehandelter Fehler " + e.Message)
        End Sub

     

    der Unbehandelte Exception läuft hier auch auf aber ich kann die Exception nicht "zurück" setzen und das Programm beendet sich.

    Ich will aber nur mein Aktuelles Usercontrol schliesen !

    Wie mach ich das ?

    Grüße

    Klaus

     


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010
    Donnerstag, 10. Februar 2011 08:33
  • Hallo Klaus,

    Du musst noch args.Handled = True setzen.

    Du brauchst aber eigentlich die Klimmzüge, die Du da machst, nicht wirklich. In Application.xaml baust du im Window-tag einfach ein DispatcherUnhandledException= ein. Wenn Du dann noch ein Anführungszeichen dazupackst, sollte Intellisense Dir den Handler dazu erzeugen. Dort dann:

    Dim ex As Exception = e.Exception
    MsgBox("Unbehandelter Fehler " + ex.Message)
    '...
    e.Handled=True
    
    

     

    War erst verwirrt ob Deines e.Message , da e üblicherweise für die *EventArgs verwendet wird. :-)


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Donnerstag, 10. Februar 2011 08:46
  • hallo Klaus

    Ungetestet und ganz spontan:

    - über e.originalSource einen Zugriff auf den Auslöser (das UserControl) bekommen

    - dann dieses Objekt explizit terminieren

    - dann e.handled = true

    - dann Ausgabe der Messagebox und explizit MainWindow.show rufen

    Ist zwar meinerseits im Nebel gestochert aber so würde ich es von der Logik her angehen.

    Grüße


    Michael Lutz, BITsoft
    Donnerstag, 10. Februar 2011 08:50
  • Halo Olaf,

     

    Danke für die Antwort aber was ist mit "Windows-Tag" gemeint komm da iregenwie ncith weiter ??

    Bitte um kurzes code bsp.

    Danke im vorraus

     

    Grüße

    Klaus

     


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010
    Donnerstag, 10. Februar 2011 09:31
  • Hi Klaus,

    grunz, das war allerdings missverständlich, denn es geht ja nicht um ein Window - sorry dafür. Gemeint ist das im XAML Deiner Application.xaml einleitende <Application ....>-tag. Dort kannst Du (übrigens auch per Intellisense - einfach mal Strg-Leertaste drücken) EventHandler definieren, die auf dem Application-Level gefeuert werden. Hier mal beispielhaft der Inhalt einer möglichen Application.xaml, in der der Handler hinterlegt ist:

    <Application x:Class="Application"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      DispatcherUnhandledException="Application_DispatcherUnhandledException"       
      StartupUri="IrgendeinWindow.xaml">
      <!-- ... -->
    </Application>
    
    

     

    Wenn Du das bei Dir per copy'n'paste einfügst, existiert allerdings in Deinem Code oben aufgeführte / genannte Event-Handler ("Application_DispatcherUnhandledException") natürlich nicht. Wenn Du aber im Xaml den Teil nach dem = entfernst und dann =" eingibst, sollte Intellisense Dir anbieten, den Handler im Code zu erzeugen. Dort dann den bereits geposteten Code einfügen.

    Oder, alternativ, einfach diesen (entsprechenden) Code einfügen:

    Private Sub Application_DispatcherUnhandledException( _
    			ByVal sender As System.Object, _
    			ByVal e As System.Windows.Threading.DispatcherUnhandledExceptionEventArgs)
    	Dim ex As Exception = e.Exception
    	MsgBox("Unbehandelter Fehler: " + ex.Message)
    	e.Handled=True
    End Sub
    
    


    Cheers,
    Olaf
    http://blogs.intuidev.com
    • Als Antwort markiert WPF_Klaus Dienstag, 15. Februar 2011 09:39
    Donnerstag, 10. Februar 2011 10:19
  • Hi Olaf,

     

    ist heut nicht mein Tag.

     

    Habe jetzt folgendes gemacht:

    <Application x:Class="Application"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DispatcherUnhandledException="Application_DispatcherUnhandledException"
                
        StartupUri="MainWindow.xaml">
       
    .....

    und dann im MainWindow.xaml.vb

     Public Sub Application_DispatcherUnhandledException(ByVal sender As System.Object, ByVal e As System.Windows.Threading.DispatcherUnhandledExceptionEventArgs)
            Dim ex As Exception = e.Exception
            MsgBox("Unbehandelter Fehler: " + ex.Message)
            e.Handled = True
        End Sub

    aber wenn eine Exception in meinem UserControl auftritt kommt keine Msgbox und das programm beendet sich !?

     

    Was brauch ich denn noch ?

     

    Grüße (und holl mir noch nen starken kafee)

    Klaus

     

     

     


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010
    Donnerstag, 10. Februar 2011 11:13
  • So starker Kaffe hat erstmal geholfen.

     

    Visual Studio 2010 erstelt also im application.xaml.VB dei Public Sub und ich muss sie nicht selber "Irgenwo" (Bei mir im MainWindow.xaml.vb)Erstellen.

    Das hab ich jetzt endlich mal gefunden ABER in meinem Usercontrol btw. UserControl.xaml.VB läuft er auf eine Exception

     FileCopy("C:\TEMP\aaa.txt", "c:\TEMP\klaus.txt")

    aber er läuft nicht in mein  Public Sub Application_DispatcherUnhandledException ??

    Was hab ich vergessen einzutragen ? oder bin ich auf dem Holzweg ??

     

    Grüße Klaus der für alle anregungen dankbar ist

     


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010
    Dienstag, 15. Februar 2011 09:14
  • So

     

    jetzt das ganze  mal erstellt und nicht im debugmode gearbeitet und siehe da es Funktioniert !!!!

    Da muss man erst drauf kommen das sich das im Debugmodus anderst verhält !

    Aber Haupsache es Funktioniert jetzt

     

    Grüße an alle

    Klaus

     

     

     


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010
    Dienstag, 15. Februar 2011 09:39
  • Hi Klaus,

    oops - Dein letztes Posting ist mir irgendwie abhanden gekommen - sorry dafür.

    Aber gut, dass Du's selbst hinbekommen hast - danke auch für die Rückmeldung. Bin allerdings ein wenig verwirrt, denn in meiner Forum-Solution nutze ich den Code aus dem von Dir als Antwort markierten Posting.

    Habe das auch gerade nochmal geprüft: Egal, ob ich im Debug- oder Release-Modus kompiliere, funktioniert das in im Prinzip gleicher Art und Weise. Sprich, der Handler wird aufgerufen, wenn eine Exception ohne entsprechendes Try/Catch darum geworfen wird.
    Das jedenfalls habe ich mit einem throw new Exception(); im Konstruktor jew. eines Windows und eines UserControls getestet. Sprich, die Verhaltensweise sollte identisch sein, mal abgesehen davon, dass Du im Release-Modus ggf. in einer Disassembly landest, wenn Du aus VS heraus startest.


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Dienstag, 15. Februar 2011 10:05
  • Hi Olaf,

    ok es geht auch im Debuggmodus.

    Entweder zu viel oder zu wenig Kaffee das mus ich mal Testen .-)

     

    Grüße

    Klaus


    Visual Studio 2010 Proffessional / Microsoft Visual Basic 2010
    Dienstag, 15. Februar 2011 11:06
  • Hi Klaus,

    puh, mein Weltbild bleibt erhalten. Kaffee: stimmt, das Zoich hilft meistens. Bei mir jedenfalls; zu wenig gibt's da nicht. :-)


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Dienstag, 15. Februar 2011 12:13