Announcement

Collapse
No announcement yet.

Globale Fehlerbehandlung

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

  • Globale Fehlerbehandlung

    Edit Moderator: Ich hab den Titel von "Fehler auslesen" auf "Globale Fehlerbehandlung geändert".


    Hallo,
    ich würde gerne theoretisch aufkommende Programmfehler in eine log-datei schreiben. da ich ungern bei jeder einzelnen Prozedur einen Fehlerabfang programmieren will, würde ich gerne einen zentralen allgemeinen Fehlerabfang programmieren, welcher aufgerufen wird, falls irgendwo im Programm ein Fehler auftaucht.

    Dieser Fehlerabfang sollte dann die Prozedur, in der der Fehler aufgetreten ist, an die log-datei übersenden.

    ist das möglich?

    danke
    stash
    Zuletzt editiert von gfoidl; 15.07.2009, 16:12. Reason: Titeländerung

  • #2
    Schau mal mein Snippet an. Ist das so etwas was du suchst?


    mfG Gü
    Zuletzt editiert von gfoidl; 14.07.2009, 14:47. Reason: Falscher Link -> korrigiert
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Ich nehme mal an, du willst in dem Fall das Programm sowieso beenden, oder?

      Du müsstest die Main() Sub mit try Catch klammern, und kannst dann den StackTrace der Exception auswerten, also in etwa:
      [highlight=vbnet]
      Public Sub Main (args As String())
      InitApplication(args)

      Try
      Dim f As New frmMain
      Application.Run(f)
      Catch ex As Exception
      WriteToLog(ex.StackTrace)
      Finally
      CleanUpApplication()
      End Try
      End Sub
      [/highlight]

      Wenn Du nur die Funktion loggen willst, in der der Fehler aufgetereten ist, dann must Du entsprechend ex.StackTrace parsen.
      Zuletzt editiert von M.Dietz; 14.07.2009, 14:24. Reason: Code geändert um Fehler bei Erstellung des MainForms auch abzufangen

      Comment


      • #4
        hallo,
        erstmal danke für die antwort. allerdings würde mir das bei meinem programm nicht weiterhelfen, wenn ich mir die zeilennumer ausgeben lasse.

        wie bereits erwähnt, würde ich, bei auftritt eines Fehlers, den Namen der Prozedur gerne rausschreiben, in der der Fehler aufgetreten ist (Falls auch noch zusätzlich die Form auszulesen ist, dann wäre das noch besser). Prozedurname und Formname sollten dann in einer log-datei verzeichnet werden.

        mfg
        stash

        Comment


        • #5
          wie bereits erwähnt, würde ich, bei auftritt eines Fehlers, den Namen der Prozedur gerne rausschreiben, in der der Fehler aufgetreten ist (Falls auch noch zusätzlich die Form auszulesen ist, dann wäre das noch besser). Prozedurname und Formname sollten dann in einer log-datei verzeichnet werden.
          Alle gewünschten Infos sind im StackTrace (wie im Beispiel von Martin gezeigt) enthalten.


          @Martin: Wenn die Anwendung mit mehreren Threads arbeitet dann funktioniert das try-catch leider nicht mehr. Dann muss eine Variante wie oben der Link zum Snippet zeigt verwendet werden.


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

          Comment


          • #6
            Hallo,
            erstmal danke für die antworten.

            Mittlerweile bin ich ein bisschen schlauer und weiß, dass ich einen globalen Fehlerabfang benötige, welcher immer eingesetzt wird, sobald das Programm einen Fehler produziert. bei meiner Internetrecherche bin ich auf folgenden Code gestoßen:


            ---------------------------------------------------------------------------
            [highlight=vbnet]
            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.
            ---------------------------------------------------------------------------

            Allerdings weiß ich jetzt nicht genau, wie ich diesen Code in mein Projekt integrieren soll.

            Also ich habe eine Hauptform sozusagen (Form1) und mehrere andere Forms und auch Klassen.
            Ist dann dieses MainForm im Code mein Form1? Desweiteren verstehe ich nicht, was in dem code mit "MainForm = New Frm_Main" gemeint ist (bzw. des Frm_Main gibt es nicht).

            Auch mit dieser Aussage "Das Modul muss das Startobjekt des Projekts sein" kann ich nichts anfangen. Bitte um Hilfe. Danke

            mfg
            stash
            Zuletzt editiert von gfoidl; 15.07.2009, 09:33. Reason: Code-Formatierung

            Comment


            • #7
              Also ich habe eine Hauptform sozusagen (Form1) und mehrere andere Forms und auch Klassen.
              Ist dann dieses MainForm im Code mein Form1?
              Ja.

              Desweiteren verstehe ich nicht, was in dem code mit "MainForm = New Frm_Main" gemeint ist (bzw. des Frm_Main gibt es nicht).
              MainForm...Variablenname
              Frm_Main...Klasse welche die Form darstellt
              Mittels des Befehls wird eine neue Instanz der Klasse Frm_Main erstellt und in die Variable MainForm gesteckt.

              Auch mit dieser Aussage "Das Modul muss das Startobjekt des Projekts sein" kann ich nichts anfangen.
              .net-Programme beginnen immer mit einer Methode die Main heißt. Da diese Methode in diesem Modul ist wird von diesem Modul aus das Programm gestartet.
              Wenn du ein neues VB-Projekt erstellst dann gibt es dort eine Program.vb - dort gehört dieser Code hinein.


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

              Comment


              • #8
                Originally posted by Stash View Post
                ... bei meiner Internetrecherche bin ich auf folgenden Code gestoßen:
                Dann markiere es auch als Code, damit man ihn vernünftig lesen kann. Dazu gibt es Gü's Anleitung Formatierung als VB.Net; notfalls kann auch ein Bereich mit dem #-Button gekennzeichnet werden. So ist es unlesbar. Jetzt bedanke dich bitte bei Gü, dass er das für dich erledigt hat, während ich dies geschrieben habe.

                Allerdings weiß ich jetzt nicht genau, wie ich diesen Code in mein Projekt integrieren soll....

                Auch mit dieser Aussage "Das Modul muss das Startobjekt des Projekts sein" kann ich nichts anfangen.
                Das Ganze ist Teil der Program.vb (oder so), siehe auch openbook VB 2008 Kap.11. Wie ein Grundgerüst einer WinForms-Anwendung aussieht, solltest du schnell lernen, z.B. mit Gü's Erläuterung.

                Gruß Jürgen

                Comment


                • #9
                  jo, danke fürs formatieren.

                  noch eine frage. ich finde diese program.vb nicht bei mir. das müsste so eine art automatisch generierter Code sein, welcher nicht direkt angesteuert werden kann.

                  wie komm ich denn an diese vb-datei ran?

                  mfg stash

                  Comment


                  • #10
                    Siehe ->
                    Das Ganze ist Teil der Program.vb (oder so), siehe auch openbook VB 2008 Kap.11. Wie ein Grundgerüst einer WinForms-Anwendung aussieht, solltest du schnell lernen,

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

                    Comment


                    • #11
                      Hallo,
                      der link ist gut. erstmal danke dafür. allerdings werde ich aus dem kapitel auch nicht schlau. da gibt es keine program.vb und ich habe mein ganzes projekt nach einer application.run durchsucht, finden tu ich aber nichts.

                      bitte um hilfe.

                      mfg
                      stash

                      Comment


                      • #12
                        der link ist gut.
                        Hab mir jetzt mal selber das durchgelesen und es stehen alle Infos da die du brauchst - du musst es halt durchlesen


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

                        Comment


                        • #13
                          hallo,
                          bitte versteh mich jetzt nicht falsch, aber wie ich an die datei rankomme steht nicht drin. es steht drin, dass der code automatisch generiert wird und das man theoreitsch selbst so eine datei anlegen kann (das will ich aber gar nicht, weil ich nur die automatisch generierte datei um den fehlerabfang erweitern würde)

                          wie kommt man denn jetzt genau an diese main methode ran.
                          vielen dank für eure mühe.

                          mfg stash

                          Comment


                          • #14
                            selbst so eine datei anlegen kann (das will ich aber gar nicht, weil ich nur die automatisch generierte datei um den fehlerabfang erweitern würde)
                            Ist die automatisch generierte Datei zugreifbar? Wenn ja baue den Code dort ein. Wenn nicht erstell eben eine Datei - es gehört ja nicht viel Code dort hinein.


                            mfG Gü

                            PS: Nur als Anmerkung:
                            VB versucht seit jeher alles zu Vereinfachen aber dadurch entstehen viele neue Probleme wie zB das hier. Würdest du mit C# entwickeln dann wäre die ganze Diskussion hyperliquid weil es dort einen Aufbau gibt der den ausführbarern Code wiederspiegelt und keine "Verkomplizierung" wie in VB.
                            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                            Comment


                            • #15
                              hi,
                              das ist genau das problem. diese automatisch generierte datei ist wohl nicht zugreifbar, weil ich sie nirgendwo finde. eine eigene datei würde ich nur ungern erstellen, da sich die mit der automatisch generierten wohl blockieren würde.

                              hat nicht irgendjemand eine idee, wie ich auf diese main methode zugreifen kann?

                              mfg
                              stash

                              Comment

                              Working...
                              X