Hallo!

So eine Klasse hatte ich auch mal im Einsatz. Eine kleine Assembly, die man
�berall einsetzen konnte, die eine E-Mail an den Entwickler und/oder einen
Eintrag ins EventLog und/oder eine MessageBox f�r den Anwender erzeugt.
Wahrscheinlich genau das, was Dir so verschwebt, oder?

Das kleine Problem ist, dass w�hrend der Ausf�hrung dieser Assembly wiederum
Exceptions entsstehen k�nnen, und das gr��ere Problem ist, dass beim Laden
der Assembly eine Exception erzeugt wird. Also braucht man trotz
ExceptionHandling-Assembly immer auch ein ExceptionHandling im eigentlichen
Programm.

Ich habe mich in der vorletzten Woche schon zu dem Thema ge�u�ert. Die
Quintessenz ist, dass ich jetzt mein "globales ExceptionHandling" im
Source-Code mache und mir ein paar zentrale Exception-Routinen aus dem VSS
in jedes Projekt (Web oder WindowsForms) einbinde.

z. B. Eintrag ins EventLog:

Sub ExceptionsWriteToEventLog(ByVal ex As Exception)
   Try
      Dim message as String = ex.Message & Environment.NewLine &
ex.StackTrace
      Dim source as String =
Diagnostics.Process.GetCurrentProcess.ProcessName
      If Not Diagnostics.EventLog.SourceExists(source) Then
Diagnostics.EventLog.CreateEventSource(source, "Application")
      Dim log As New Diagnostics.EventLog
      log.Log = "Application"
      log.Source = "domain.tld"
      log.WriteEntry(message)
   Catch : End Try
End Sub

Oder E-Mail an Entwickler:

Sub ExceptionsMailToDeveloper(ByVal ex As Exception)
   Try
      Dim message as String = ex.Message & Environment.NewLine &
ex.StackTrace
      Dim source as String =
Diagnostics.Process.GetCurrentProcess.ProcessName
      Web.Mail.SmtpMail.Send( _
       (Environment.UserName & "_" & Environment.MachineName & "@" &
Environment.UserDomainName).Replace(" ", ""), _
       "[EMAIL PROTECTED]", _
       "Fehler in " & source, _
       message)
   Catch : End Try
End Sub

In einer Web-Applikation kann man das dann innerhalb von
Application_Error(...) der Global.asax einsetzen:

Dim ex as Exception = Me.Server.GetLastError()
If Me.Server.MachineName().StartsWith("VDB") Then
   Throw ex
Else
   Try
      Call ExceptionsMailToDeveloper(ex)
   Catch
      Call ExceptionsWriteToEventLog(ex)
   End Try
End If

Eine WindowsForms-Applikation wird bei mir nie �ber die Form-Klasse sondern
immer �ber Sub Main() gestartet, auch wegen der XP-Styles,
Single-Instance-Test, Splash-Form, ...

Shared Sub Main()
   Try
      ' single instance
      If
Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess
.ProcessName).Length > 1 Then
         MessageBox.Show("Das Programm l�uft bereits auf diesem Rechner")
         Application.ExitThread()
      End If
        ' XP-Styles
      Application.EnableVisualStyles()
      ' SplashForm, externe Assemblies und FormMain starten
      Dim splash As New jvdb.Splasher
      splash.Show()
      Application.Run(New FormMain)
   Catch ex As Exception
#If DEBUG = True Then
      Throw ex
#Else
      MessageBox.Show("Eine Situation ist eingetreten, die vom Programm
(noch) nicht nehandelt wird. Der Vorgang ist protokolliert. Versuchen Sie es
noch einmal oder  wenden Sie sich an den HelpDesk.")
      Call ExceptionsMailToDeveloper(ex)
      Call ExceptionsWriteToEventLog(ex)
#End If
   Finally
      Application.ExitThread()
   End Try
End Sub

Ansonsten gilt es, den Code mit If-Then-Else o.�. lokal abzusichern, oder
Alternativen mit Try-Catch-Finally einzubauen oder mitunter auch Exceptions
einfach zu ignorieren Try-Catch-EndTry. Ganz wichtig ist meines Erachtens,
dass die Exceptions f�r den Entwickler auch ankommen. Ein Try-Catch-Finally
vorsorglich in jedem einzelnen Modul verhindert das eher.

Freundliche Gr��e
Joachim van de Bruck 

_______________________________________________
Asp.net mailing list
[EMAIL PROTECTED]
http://www.glengamoi.com/mailman/listinfo/asp.net

Antwort per Email an