Announcement

Collapse
No announcement yet.

Globale Fehlerbehandlung möglich?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Globale Fehlerbehandlung möglich?

    Hallo,

    mich würde mal interessieren, ob es machbar ist, eine Art 'globale' Fehlerbehandlung in eine Anwendung (Forms oder Kommandozeile...) einzubauen, die alle Exceptions zur Laufzeit abfängt.

    Hin und wieder schreib ich ein paar kleine Programme, wo ich eigentlich keine Lust habe, an jeder nur erdenklichen Stelle try .. catch's einzubauen. Da würde es mir reichen, wenn im Fehlerfall ein 'ordentlicher' Dialog von mir auf das kommende Beenden der Anwendung auf Grund eines Fehler hinweisen würde...

  • #2
    Hallo,

    ja die Möglichkeit gibt es. Mein Snippet http://dotnet-snippets.de/dns/globale-fehlerbehandlung-fuer-winform-SID983.aspx zeigt in C# die Möglichkeit wie es geht.

    Den nachfolgenden VB.net habe ich mit http://www.developerfusion.com/tools/convert/csharp-to-vb/ übersetzt - also automatisch und somit keine Garantie dass es fuktioniert.

    [highlight=vbnet]
    Imports System
    Imports System.Windows.Forms

    Namespace WindowsFormsApplication1
    * * Module Program
    * * * * Private Sub New()
    * * * * End Sub
    * * * * <STAThread()> _
    * * * * Private Sub Main()
    * * * * * * ' Ereignis-Handler für UI-Threads:
    * * * * * * AddHandler Application.ThreadException, AddressOf Application_ThreadException
    * * * * * *
    * * * * * * ' Alle unbehandelten WinForms-Fehler durch diesen Ereignis-Handler
    * * * * * * ' zwingen (unabhängig von config-Einstellungen):
    * * * * * * Application.SetUnhandledExceptionMode(UnhandledExc eptionMode.CatchException)
    * * * * * *
    * * * * * * ' Ereignis-Hanlder für nicht UI-Threads:
    * * * * * * AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException
    * * * * * *
    * * * * * * ' Dieser try-catch-Block ist im Prinzip nicht nötig.
    * * * * * * ' Hier ist er aber trotzdem damit die beiden Ereignisse
    * * * * * * ' an diesen weiterleiten können und der anschießende
    * * * * * * ' finally-Block zur Speicherbereinigung ausgeführt
    * * * * * * ' werden kann
    * * * * * * Try
    * * * * * * * * ' Anwenung ausführen:
    * * * * * * * * Application.EnableVisualStyles()
    * * * * * * * * Application.SetCompatibleTextRenderingDefault(Fals e)
    * * * * * * * * Application.Run(New Form1())
    * * * * * * Catch ex As Exception
    * * * * * * * * MessageBox.Show(ex.Message)
    * * * * * * Finally
    * * * * * * * * ' Da es statische Ereignisse sind wird zur Speicherschonung
    * * * * * * * * ' der Handler entfernt:
    * * * * * * * * AppDomain.CurrentDomain.UnhandledException -= CurrentDomain_UnhandledException
    * * * * * * * * Application.ThreadException -= Application_ThreadException
    * * * * * * End Try
    * * * * End Sub
    * * * * '---------------------------------------------------------------------
    * * * * ''' <summary>
    * * * * ''' Ereignisbehandlung für Thread-Exceptions
    * * * * ''' </summary>
    * * * * ''' <param name="sender"></param>
    * * * * ''' <param name="e"></param>
    * * * * Private Sub Application_ThreadException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
    * * * * * * ' Weiterleiten der Exception:
    * * * * * * Throw e.Exception
    * * * * End Sub
    * * * * '---------------------------------------------------------------------
    * * * * ''' <summary>
    * * * * ''' Ereignisbehandlung für alle anderen unbehandelten Exceptions
    * * * * ''' </summary>
    * * * * ''' <param name="sender"></param>
    * * * * ''' <param name="e"></param>
    * * * * Private Sub CurrentDomain_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
    * * * * * * ' Weiterleiten der Exception:
    * * * * * * Throw DirectCast(e.ExceptionObject, Exception)
    * * * * End Sub
    * * End Module
    End Namespace
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke, ich seh's mir mal an...

      Comment


      • #4
        das hier funktioniert:

        [highlight=vb.net]
        Module mod_Main
        Sub Main()
        ' allgemeinen Exceptionhandler einrichten
        AddHandler System.Windows.Forms.Application.ThreadException, AddressOf OnThreadException
        MainForm = New Frm_Main
        ' Programm mit Hauptfenster durchstarten
        Application.Run(MainForm)
        End Sub

        Public Sub OnThreadException(ByVal sender As Object, ByVal t As System.Threading.ThreadExceptionEventArgs)
        ' Allgemeiner Fehlerhandler
        ' Fehlermeldung holen: incl. Callstack
        Dim ErrText As String = t.Exception.ToString
        ' ... oder nur Fehlerbeschreibung
        'ErrText = t.Exception.Message
        ' ggf. auf Konsole ausgeben
        'Console.WriteLine(“Exception aufgetreten: “ + ErrText)
        ' und/oder im Ausgabefenster der IDE
        'Debug.WriteLine(“Exception aufgetreten: “ + ErrText)
        ' Fehler melden mit Option Weiter oder Abbrechen
        ErrText = String.Concat(ErrText, vbCrLf, vbCrLf, "Programm dennoch fortfahren?")
        If MsgBox(ErrText, MsgBoxStyle.Exclamation Or MsgBoxStyle.YesNo, "Fehler aufgetreten") = MsgBoxResult.No Then
        ' Programmende bei “No”
        Try
        ' Fenster schließen
        ' dabei weitere Exceptions ignorieren
        MainForm.BeendenButtonPressed = True
        MainForm.Close()
        Catch
        End Try
        ' und Schluss!
        Application.Exit()
        End If
        End Sub
        End Module
        [/highlight]

        Das Modul muss das Startobjekt des Projekts sein.

        Comment


        • #5
          Wie kann ich denn die Main Prozedur (ein "NichtForm") zum Startobjekt der Anwendung machen, ohne "Anwendungsframework aktivieren" abschalten zu müssen (ist es an, kann ich nur Forms auswählen)?
          Attached Files

          Comment

          Working...
          X