none
Fehler richtig abfangen RRS feed

  • Frage

  • Hallo zusammen,

    wie kann man neben einer globalen Fehlerbehandlung noch mit

    "Try - Catch" arbeiten?

    Ich möchte gern globale Fehler, wie die

     - AppDomain.CurrentDomain.UnhandledException

    global behandeln, aber einfache Fehler, wie die 

    - System.IO.DirectoryNotFoundException

    mit Try - Catch abfangen.

    Leider läuft die AppDomain.CurrentDomain.UnhandledException immer in den 

    Try-Catch-Block und lässt sich dort nicht vernünftig behandeln.

    Dirk


    • Bearbeitet Dirk2006 Samstag, 20. Januar 2018 15:53
    Samstag, 20. Januar 2018 15:51

Antworten

  • Hi Dirk,
    Dein Probleme habe ich nicht verstanden. Du kannst Doch im zweiten Thread alle Fehlerereignisse abfangen, z.B. so:

    Imports System.Threading
    
    Module Module19
    
      <STAThread>
      Sub Main()
        Try
          AddHandler AppDomain.CurrentDomain.UnhandledException, Sub(sender As Object, e As UnhandledExceptionEventArgs)
                                                                   Console.WriteLine(e.ToString)
                                                                 End Sub
          Dim c As New Demo
          c.Execute()
          'Thread.Sleep(1000)
        Catch ex As Exception
          Console.WriteLine(ex.ToString)
        End Try
        Console.WriteLine("weiter mit Taste")
        Console.ReadKey()
      End Sub
    
      Friend Class Demo
        Friend Sub Execute()
          Try
            Call (New Thread(New ParameterizedThreadStart(Sub(obj As Object)
                                                            Try
                                                              Throw New Exception("from Thread")
                                                            Catch ex As Exception
                                                              Console.WriteLine(ex.ToString)
                                                            End Try
                                                          End Sub))).Start()
          Catch ex As Exception
            Console.WriteLine(ex.ToString)
          End Try
          Throw New Exception("from Main-Thread")
        End Sub
      End Class
    End Module


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 21. Januar 2018 17:00

Alle Antworten

  • Hi Dirk,
    dein Problem kann ich nicht reproduzieren. Der Try-Block um den Zugriff auf das Verzeichnis verzweigt beim Versuch, ein nicht vorhandenes Verzeichnung zu nutzen, in den Catch-Block. Wenn dort kein Throw ausgeführt wird, wird auch UnhandledException nicht aufgerufen.

    Was verstehst Du unter "...nicht vernünftig behandeln"?


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Samstag, 20. Januar 2018 17:26
  • Hallo Peter,

    vielleicht habe ich mich nicht glücklich ausgedrückt.

    Ich möchte gern eine WPF-Anwendung erstellen. 

    Die Anwendung läuft in einem "Thread": 

    Public Shared Sub Main() => System.STAThreadAttribute().........

    Wenn ich in der Anwendung einen zweiten "Thread" starte, 

    und in diesem zweiten "Thread" einen Fehler generiere, lässt sich der generierte Fehler

    nicht vernünftig mittels Try - Catch abfangen (Nur mittels Catch ex As Exception).  

    Global könnte ich mittels eines Handlers - AppDomain.CurrentDomain.UnhandledException eine 

    Zuordnung vornehmen und entsprechend reagieren.

    Deshalb würde ich gern neben Catch-Anweisungen auch mit einer globalen

    Fehlerbehandlung arbeiten.

    Ist das Blödsinn??

    Dirk

     

    Sonntag, 21. Januar 2018 13:05
  • Hi Dirk,
    Dein Probleme habe ich nicht verstanden. Du kannst Doch im zweiten Thread alle Fehlerereignisse abfangen, z.B. so:

    Imports System.Threading
    
    Module Module19
    
      <STAThread>
      Sub Main()
        Try
          AddHandler AppDomain.CurrentDomain.UnhandledException, Sub(sender As Object, e As UnhandledExceptionEventArgs)
                                                                   Console.WriteLine(e.ToString)
                                                                 End Sub
          Dim c As New Demo
          c.Execute()
          'Thread.Sleep(1000)
        Catch ex As Exception
          Console.WriteLine(ex.ToString)
        End Try
        Console.WriteLine("weiter mit Taste")
        Console.ReadKey()
      End Sub
    
      Friend Class Demo
        Friend Sub Execute()
          Try
            Call (New Thread(New ParameterizedThreadStart(Sub(obj As Object)
                                                            Try
                                                              Throw New Exception("from Thread")
                                                            Catch ex As Exception
                                                              Console.WriteLine(ex.ToString)
                                                            End Try
                                                          End Sub))).Start()
          Catch ex As Exception
            Console.WriteLine(ex.ToString)
          End Try
          Throw New Exception("from Main-Thread")
        End Sub
      End Class
    End Module


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 21. Januar 2018 17:00
  • Danke Peter...
    Freitag, 2. Februar 2018 10:23