unexpectedExceptionHandler

    • Beta

    Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Wulf.

      unexpectedExceptionHandler

      Name des Programms:
      unexpectedExceptionHandler

      Beschreibung:
      Die lib löst ein Event aus wenn ein unerwarteter Fehler auftritt. In diesem Event wird dann der Fehler zum weiterverarbeiten zur verfügung gestellt, um dort z.B. eine Meldung an den Benutzer auszugeben.
      Ist "ExitApplicationOnError" auf False gesetzt so läuft die Anwendung nach auftreten eines Fehlers weiter (nicht zu empfehlen da die Anwendung dann meist in einem ungültigem Zustand ist.)
      Das Programm ist nicht dazu gedacht jegliche Fehlermeldungen abzufangen und das Programm unter allen Umständen am laufen zu halten.
      Des weiteren enthällt die lib noch 2 Extension-Methods mit deren Hilfe man Zeile und Datei in der die Ausnahme aufgetreten ist herausfinden kann. (Diese beiden Mothoden wurden allerdings noch nicht wirklich auf Fehler getested und es kann hier noch zu fehlern kommen)
      Extension-Methods:

      VB.NET-Quellcode

      1. [Exception].GetLineOfError()

      und

      VB.NET-Quellcode

      1. [Exception].GetFileOfError()


      Screenshot(s):
      Keine da lib

      Verwendete Programmiersprache:
      Visual Basic .NET (IDE: VB 2010 Express)

      Systemanforderungen:
      .NET Framework 3.5 Client Profile
      3.5 auf Grund der Extension-Methods

      Lizenz/Weitergabe:
      Opensource (Source folgt wenn ich diese noch überarbeitet und ein wenig aufgehübscht hab)

      Anwendungsbeispiel:

      VB.NET-Quellcode

      1. 'Zunächst müsst ihr den ErrorHandler Global erstellen:
      2. Private WithEvents ErrorHandler As ExceptionHandler

      VB.NET-Quellcode

      1. 'Hiermit wir der ErrorHandler Initialisiert:
      2. ErrorHandler = New ExceptionHandler()
      3. ErrorHandler.ExitApplicationOnError = True
      4. ErrorHandler.EnableErrorHandling()


      VB.NET-Quellcode

      1. 'So könnte eine mögliche Anwendung aussehen
      2. Private Sub ErrorHandler_ExceptionOccurred(Sender As Object, e As System.Exception) Handles ErrorHandler.ExceptionOccurred
      3. MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten: " & e.Message, "Unerwarteter Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
      4. End Sub


      //Edit hier mal der sourcecode: (wie gesagt ist nicht viel und war hauptsächlich für mich selbst entwickelt)

      VB.NET-Quellcode

      1. Imports System.ComponentModel
      2. Imports System.Runtime.CompilerServices
      3. Imports System.Text.RegularExpressions
      4. ''' <summary>
      5. ''' Klasse zum behandeln unerwarteter Fehler
      6. ''' </summary>
      7. Public Class ExceptionHandler
      8. ''' <summary>
      9. ''' Gibt an ob die Anwendung bei Auftreten eines Fehlers beendet werden soll.
      10. ''' </summary>
      11. <DefaultValue(False)> Public Property ExitApplicationOnError
      12. ''' <summary>
      13. ''' Tritt auf wenn eine unbehandelte Ausnahme auftritt.
      14. ''' </summary>
      15. ''' <param name="Sender">Die Methode in der der Fehler auftrat (vom Type System.Reflection.MethodeBase)</param>
      16. ''' <param name="e">Die Ausnahme als Exception</param>
      17. ''' <remarks></remarks>
      18. Public Event ExceptionOccurred(ByVal Sender As Object, ByVal e As Exception)
      19. Private currentDomain As AppDomain
      20. Public Sub New()
      21. currentDomain = AppDomain.CurrentDomain
      22. End Sub
      23. ''' <summary>
      24. ''' Startet das Errorhandling
      25. ''' </summary>
      26. Public Sub EnableErrorHandling()
      27. AddHandler currentDomain.UnhandledException, AddressOf internEXHandler
      28. AddHandler Application.ThreadException, AddressOf internThreadEXHandler
      29. End Sub
      30. ''' <summary>
      31. ''' Beendet das Errorhandling
      32. ''' </summary>
      33. Public Sub DisableErrorHandling()
      34. RemoveHandler currentDomain.UnhandledException, AddressOf internEXHandler
      35. RemoveHandler Application.ThreadException, AddressOf internThreadEXHandler
      36. End Sub
      37. Private Sub internEXHandler(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
      38. Dim EX As Exception = CType(e.ExceptionObject, Exception)
      39. RaiseEvent ExceptionOccurred(EX.TargetSite, EX)
      40. If ExitApplicationOnError Then Application.Exit()
      41. End Sub
      42. Private Sub internThreadEXHandler(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs)
      43. Dim EX As Exception = e.Exception
      44. RaiseEvent ExceptionOccurred(EX.TargetSite, EX)
      45. If ExitApplicationOnError Then Application.Exit()
      46. End Sub
      47. End Class
      48. Public Module ExceptionExtension
      49. <Extension()> _
      50. Public Function GetLineOfError(ByVal EX As Exception) As Integer
      51. Dim ST As New StackTrace(EX, True)
      52. Return ST.GetFrame(0).GetFileLineNumber()
      53. End Function
      54. <Extension()> _
      55. Public Function GetFileOfError(ByVal EX As Exception) As String
      56. Dim ST As New StackTrace(EX, True)
      57. Return ST.GetFrame(0).GetFileName
      58. End Function
      59. End Module
      Dateien

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Wulf“ ()

      Die lib benutzt auch diese vorhandenen Funktionen. Ich hab diese primär für mich selbst erstellt um das ganze in der Arbeit schneller und einfacher verwenden zu können. Die lib besteht im Großen und ganzen vielleicht aus 50 zeilen code.
      Vielleicht stellst du dann eher den Code und deine Klassen zur Verfügung.
      Nich jeder ist glücklich darüber seine Programme mit DLLs vollzumölen?!
      mikeb69:
      war ja nur ein gut gemeinter Vorschlag! War keine Aufforderung/ Abwertung! Ob man es verwendet ist doch eh jedem seine eigene Entscheidung?!

      Wulf schrieb:

      Public Function GetLineOfError(ByVal EX As Exception) As Integer


      Siehe:

      VB.NET-Quellcode

      1. Try
      2. Throw New ArgumentException("foo")
      3. Catch ex As Exception
      4. Dim s As New StackTrace(ex, True)
      5. Debug.Print(String.Format("Error in line {0} of file {1}", s.GetFrame(0).GetFileLineNumber, s.GetFrame(0).GetFileName))
      6. End Try


      Warum den Text "lesen", wenn Zeilennummer etc als Eigenschaften vorhanden sind?
      btw:

      VB.NET-Quellcode

      1. 'Zunächst müsst ihr den ErrorHandler Global erstellen:
      2. Private WithEvents ErrorHandler As ExceptionHandler
      3. ...
      4. ErrorHandler = New ExceptionHandler()

      BESSER: Den Konstruktur private machen und eine Shared Funktion Create() schreiben, die immer wieder DIESELBE Instanz zurückgibt. Denn ich kann mir nicht denken, dass dein System sauber läuft, wenn es 15 Instanzen gibt, die alle versuchen, eine UnhandledException zu bearbeiten, oder?

      EDIT: Hmm. Braucht der Verwender überhaupt Zugriff auf ne Instanz?

      picoflop schrieb:

      BESSER: Den Konstruktur private machen und eine Shared Funktion Create() schreiben, die immer wieder DIESELBE Instanz zurückgibt. Denn ich kann mir nicht denken, dass dein System sauber läuft, wenn es 15 Instanzen gibt, die alle versuchen, eine UnhandledException zu bearbeiten, oder?

      Wie genau stelle ich das denn an, dass ich mit der Create() funktion immer die Selbe Instanz zurück gebe?

      picoflop schrieb:

      EDIT: Hmm. Braucht der Verwender überhaupt Zugriff auf ne Instanz?

      Kann ich denn auf das Event zugreifen wenn ich keine Instanz habe?