| |
VB.NET - FortgeschritteneUnhandledException Event Stacktrace ermitteln | | | Autor: Jojo | Datum: 29.04.14 13:04 |
| Hallo,
ich habe das folgende Problem:
Ich möchte in ein Programm (vb, Framework 4.5) eine Globale Fehlerbehandlung einbauen. Dies soll eine auftretenden unerwarteten Fehler mir per Email zusenden.
Das Funktioniert auch alles super über die Datei "ApplicationEvents.vb":
Namespace My
' Für MyApplication sind folgende Ereignisse verfügbar:
'
' Startup: Wird beim Starten der Anwendung noch vor dem Erstellen des
' Startformulars ausgelöst.
' Shutdown: Wird nach dem Schließen aller Anwendungsformulare ausgelöst.
' Dieses Ereignis wird nicht ausgelöst, wenn die Anwendung nicht normal
' beendet wird.
' UnhandledException: Wird ausgelöst, wenn in der Anwendung ein
' Ausnahmefehler auftritt.
' StartupNextInstance: Wird beim Starten einer Einzelinstanzanwendung
' ausgelöst, wenn diese bereits aktiv ist.
' NetworkAvailabilityChanged: Wird beim Herstellen oder Trennen der
' Netzwerkverbindung ausgelöst.
Partial Friend Class MyApplication
''' <summary>
''' Dieses Event wird immer dann aufgerufen, wenn ein Fehler auftritt,
' der nicht behandelt wurde.
''' Dann wird ein Email mit den nötigen Daten erstellt und verschickt.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub MyApplication_UnhandledException(ByVal sender As Object, _
ByVal e As _
Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs_
) Handles Me.UnhandledException
My.Application.Log.WriteException(e.Exception, _
TraceEventType.Critical, "Unhandled Exception.")
Dim st As New StackTrace(e.Exception, True)
Dim frames As StackFrame() = st.GetFrames()
Dim TS As String = "UnhandledException:" & vbCrLf & _
e.Exception.Message & vbCrLf & vbCrLf & "Stack Trace:" & vbCrLf
' Iterate over the frames extracting the information you need
For Each frame As StackFrame In frames
TS += frame.GetFileName() & " : " & frame.GetMethod().Name & " (" & _
"" & frame.GetFileLineNumber() & "," & _
frame.GetFileColumnNumber() & ")" & vbCrLf
Next
TS += vbCrLf & e.Exception.StackTrace.ToString
'Sendmail("xxx@xxx.de", TS)
End
End Sub
End Class
End Namespace Soweit so gut. Liegt jetzt aber der Fehler in einer Unterfunktion oder in einem anderen Thread, dann bekomme ich nur den Startort im Stacktrace:
Stack Trace:
: FastWaitAll (0,0)
: Invoke (0,0)
: Invoke (0,0)
C:\Projekte10\Import_sopr.vb : Import_Load (55,9)
: Invoke (0,0)
...
at System.Threading.Tasks.Task.FastWaitAll(Task[] tasks)
at System.Threading.Tasks.Parallel.Invoke(ParallelOptions parallelOptions, Action[] actions)
at System.Threading.Tasks.Parallel.Invoke(Action[] actions)
at Import_Sopr.Import.Import_Load(Object eventSender, EventArgs eventArgs) in C:\Projekte10\Import_sopr.vb:line 55
at System.EventHandler.Invoke(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
...
Schau ich jetzt im dem File an der Line 55 nach steht dort der Ausruf mehrer Funktionen:
Parallel.Invoke(Sub()
Run1()
End Sub,
Sub()
run2()
End Sub,
Sub()
run3()
End Sub) Das heißt, dass mir die Information aus den Thead fehlt und ich stattdessen die Info aus dem Ursprung (der die Threads startet) bekomme.
Nehme ich die Fehlerbehandlung raus - bekomme ich die wahre Quelle angezeigt:
************** Exception Text **************
System.AggregateException: One or more errors occurred. ---> System.InvalidCastException: Conversion from string "Import" to type 'Integer' is not valid. ---> System.FormatException: Input string was not in a correct format.
at Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat)
at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
--- End of inner exception stack trace ---
at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
at Import_Sopr.Import.IM_DDEB() in C:\Projekte10\import\Import_sopr.vb:line 1015 at Import_Sopr.Import._Lambda$__2() in C:\Projekte10\import\Import_sopr.vb:line 65 at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of inner exception stack trace ---
Ich muss also die Gleichen Infos in meiner Email bekommen wie die, die im Abbruch-Fenster angezeigt werden.
Wer hat eine Idee wo das Problem liegt?
Joachim | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|