Problem mit Event und verschiedenen Task

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Ich habe keinen Nachweis zur Hand, der die Sinnhaftigkeit belegen könnte. Entweder fehlen mir die richtigen Fehler, oder man kann es immer anders machen.

    Manchmal vereinfacht ein Try Catch aber den Code. Und ich denke es wird auch Fälle geben, in denen Try Catch sogar besser performt. Es sollte aber nie die Entwicklung erschweren.

    Amelie schrieb:

    Muss noch herausfinden, wann die "Sinnvoll" sein können und wann eben nicht.
    Lass es knallen.
    Stelle fest, warum es knallt, und wenn sich das nicht vorher beheben lässt, wenn eine externe Funktion eine Exception bringt usw. dann fang an zu überlegen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    Ich habe keinen Nachweis zur Hand, der die Sinnhaftigkeit belegen könnte. Entweder fehlen mir die richtigen Fehler, oder man kann es immer anders machen.
    Schreibender Dateizugriff oder UIAutomation sind solche Geschichten, bei denen Exceptions kommen, die man nicht sonderlich gut abfangen kann. Auch externe DLLs können zum unerwarteten Problem werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany @ErfinderDesRades @VaporiZed @Haudruferzappeltnoch

    Moin moin

    Ich habe noch ein wenig meinen Code geändert und schon fast alle "Try/Cach-Blöcke" entfernt und mit verschiedenen Methoden ersetzt um Möglichkeiten abzufangen.
    Jetzt habe ich diese Copy-Funktion: Private Function CallCopy() As Boolean siehe CodeAusschnitte.

    Nun meine Frage: Brauche ich da noch einen Try/Catch um, wie schriebt Ihr: "unerwartete Fehler" abzufangen?

    Bin für jede Info / Hilfe dankbar. :)

    Spoiler anzeigen

    In einer Class:

    VB.NET-Quellcode

    1. Friend errorHdd As String
    2. Friend Function IsDriveReady(ByVal HDD As String) As Boolean
    3. errorHdd = HDD
    4. Dim driveInfo As New System.IO.DriveInfo(HDD.TrimEnd("\"c))
    5. Return If(driveInfo.IsReady, True, False)
    6. End Function

    In einer weiteren Class:

    VB.NET-Quellcode

    1. Friend Sub Threadsstarten(SelectedCopytype As Integer)
    2. Select Case SelectedCopytype
    3. Case Is = 0
    4. Case 0
    5. If propertyinfo.IsDriveReady(propertyinfo.SourcePath) AndAlso propertyinfo.IsDriveReady(propertyinfo.TargetCopyPath) Then
    6. ' KopiereAsync()
    7. Else
    8. RaiseEvent MeldungsID(Meldung.Failure, propertyinfo.errorHdd)
    9. End If
    10. ........
    11. .....
    12. ..
    13. '' Bräuchte ich hier noch den Try/Catch ?????
    14. Private Function CallCopy() As Boolean
    15. Try
    16. Dim NewQuelle As New IO.DirectoryInfo(propertyinfo.SourcePath), file As IO.FileInfo
    17. If IO.Directory.Exists(propertyinfo.TargetCopyPath) = False Then IO.Directory.CreateDirectory(propertyinfo.TargetCopyPath)
    18. .........
    19. ......
    20. ..

    Auf dem Form:

    VB.NET-Quellcode

    1. Private Sub Mitteilungen(ByVal var As CopyZip.Meldung, FailuerHDD As String) Handles copyzip.MeldungsID
    2. Select Case var
    3. Case copyzip.Meldung.Copy
    4. .......
    5. ...
    6. .
    7. Case copyzip.Meldung.Failure
    8. timMessages.Start()
    9. lblFormName.ForeColor = Color.Firebrick
    10. lblFormName.Text = "Fehlermitteilung: " & FailuerHDD
    11. ResetProgbar()
    12. ResetControls()
    13. End Select

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    If IO.Directory.Exists(propertyinfo.TargetCopyPath) = False Then IO.Directory.CreateDirectory(propertyinfo.TargetCopyPath)
    Ein Klassiker. Wenn das Verzeichnis bereits existiert, macht IO.Directory.CreateDirectory nix. Du kannst die Bedingungsprüfung also weglassen.
    Ob Du das Try-Catch weglassen kannst? Dazu müsstest Du schon den ganzen Code zeigen. Aber besser wäre - wie bereits mehrfach erwähnt: einfach ausprobieren!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Ich habe eine Frage zu den: ​AppDomain.CurrentDomain.UnhandledException
    Die sollen doch das abfangen, was nicht mit Try/Catch behandelt wird :?:

    Bei einem Test, ich habe den Try/catch in der Function rausgenommen und versucht auf einen vollen USB-Stick zu kopieren.
    Es wurde keine Exception geworfen :!:
    Mit dem Try/Catch bekomme ich die Exception: "Kein Speicherplatz"

    Wo denke ich falsch bei der Benutzung?



    VB.NET-Quellcode

    1. Public Sub New(propInfo As DriveManager)
    2. propertyinfo = propInfo
    3. AddHandler Application.ThreadException, AddressOf ExceptionHandlerForErrors
    4. AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf ExceptionHandlerForErrors
    5. End Sub
    6. Private Sub ExceptionHandlerForErrors(sender As Object, e As System.Threading.ThreadExceptionEventArgs)
    7. Dim ex As Exception = e.Exception
    8. MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten" & Environment.NewLine & ex.Message, "Wichtige Info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    9. End Sub
    10. Private Sub ExceptionHandlerForErrors(sender As Object, e As System.UnhandledExceptionEventArgs)
    11. Dim ex As Exception = DirectCast(e.ExceptionObject, Exception)
    12. MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten" & Environment.NewLine & ex.Message, "Wichtige Info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    13. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Es wurde keine Exception geworfen
    Würde keine Exception geworfen werden, könnte Try-Catch auch nichts auffangen (das ist schließlich die wörtliche Bedeutung von Catch).

    Mit welchem konkreten Dateikopiercode bekommst Du welchen Exception-Typ (also nicht die Fehlermeldung, sondern IO.IOException oder ArgumentException oder so)?
    In welcher Klasse befindet sich dieser AddHandler-Code, den Du gerade gezeigt hast? Der gehört nämlich eigentlich in die MainForm-Klasse, nicht in irgendeine andere Klasse, die ggf. sogar später in einem anderen Thread ausgeführt wird. Weiß man ja nicht, steht ja hier nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    So habe ich das gestestet. Beim Kopieren das selbe. ?(
    Mit dem Try/Catch in den Funktionen gehts natürlich.

    EDIT: 10:25
    Oh das mit dem "MainForm" erst jetzt gelesen... MOMENT ich test neu.


    Edit Spoiler: 10:35 Uhr !!

    Es hat sich aber nichts am verhalten geändert!

    Das Form:

    VB.NET-Quellcode

    1. Private drivehelper As New DriveManager()
    2. Private xmlhelper As New XmlManager()
    3. Private WithEvents copyzip As New CopyZip(drivehelper)
    4. Private enterPressed As Boolean = False
    5. Public Sub New()
    6. AddHandler Application.ThreadException, AddressOf ExceptionHandlerForErrors
    7. AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf ExceptionHandlerForErrors
    8. InitializeComponent()
    9. CheckXmlFile()
    10. End Sub
    11. Private Sub ExceptionHandlerForErrors(sender As Object, e As System.Threading.ThreadExceptionEventArgs)
    12. Dim ex As Exception = e.Exception
    13. MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten" & Environment.NewLine & ex.Message, "Wichtige Info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    14. End Sub
    15. Private Sub ExceptionHandlerForErrors(sender As Object, e As System.UnhandledExceptionEventArgs)
    16. Dim ex As Exception = DirectCast(e.ExceptionObject, Exception)
    17. MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten" & Environment.NewLine & ex.Message, "Wichtige Info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    18. End Sub


    Die Class:

    VB.NET-Quellcode

    1. Public Sub New(propInfo As DriveManager)
    2. propertyinfo = propInfo
    3. End Sub
    4. Private Function CallZip() As Boolean
    5. 'Try
    6. Dim Filedate As String = Date.Now.ToString("-HH_mm")
    7. If Not Directory.Exists(propertyinfo.TargetZipPath) Then Directory.CreateDirectory(propertyinfo.TargetZipPath)
    8. RaiseEvent ZipFileReport(propertyinfo.TargetZipPath & Filedate)
    9. ZipFile.CreateFromDirectory(propertyinfo.SourcePath, propertyinfo.TargetZipPath & Filedate & ".zip", CompressionLevel.Fastest, False)
    10. If Not System.IO.Directory.GetFiles(propertyinfo.TargetZipPath).Length = 0 Then
    11. Else
    12. IO.Directory.Delete(propertyinfo.TargetZipPath)
    13. End If
    14. Return True
    15. 'Catch ex As Exception
    16. ' MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten" & Environment.NewLine & ex.Message, "Wichtige Info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    17. ' Return False
    18. 'End Try
    19. End Function
    Bilder
    • error-1.jpg

      604,28 kB, 1.095×732, 31 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()

    Ich habe folgenden einfachen Testcode, der die genannte Exception erzeugt

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Friend Class FrmMain
    3. Public Sub New()
    4. AddHandler Application.ThreadException, AddressOf ExceptionHandlerForErrors
    5. AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf ExceptionHandlerForErrors
    6. InitializeComponent()
    7. End Sub
    8. Private Sub ExceptionHandlerForErrors(sender As Object, e As ThreadExceptionEventArgs)
    9. ShowError("ThreadException")
    10. End Sub
    11. Private Sub ExceptionHandlerForErrors(sender As Object, e As UnhandledExceptionEventArgs)
    12. ShowError("uncatched Exception")
    13. End Sub
    14. Private Sub ShowError(ExceptionType As String)
    15. MessageBox.Show(ExceptionType)
    16. End Sub
    17. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    18. Throw New IO.IOException
    19. End Sub
    20. End Class


    Ergebnis im Anhang. Resultat: abgefangen :D , aber mit ThreadException 8| . Bedeutet: Ich hab ThreadException ein wenig falsch verstanden und es geht bei ThreadException wohl eher um eine Exception, die innerhalb des GUI-Thread-Vorgangs ausgelöst wurde, nicht um solche, die in einem Nebenthread erfolgten. Also quasi genau das Gegenteil vom erwarteten.

    @Amelie: Aaaber! Innerhalb der Debug-Session von Visual Studio werden schon mit Absicht die Exceptions angezeigt, damit man die Fehler beheben kann. Das ist VS-Einstellungssache. Die ExceptionHandler sind ja v.a. für den Fall, dass man die Exe außerhalb von VS ausführt.

    btw: ein Verbesserungsvorschlag, um Doppelcode zu vermeiden:

    VB.NET-Quellcode

    1. Private Sub ExceptionHandlerForErrors(sender As Object, e As System.Threading.ThreadExceptionEventArgs)
    2. ShowError(e.Exception)
    3. End Sub
    4. Private Sub ExceptionHandlerForErrors(sender As Object, e As System.UnhandledExceptionEventArgs)
    5. ShowError(DirectCast(e.ExceptionObject, Exception))
    6. End Sub
    7. Private Sub ShowError(e As Exception)
    8. MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten" & Environment.NewLine & ex.Message, "Wichtige Info", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    9. End Sub

    Bilder
    • Result.png

      5,79 kB, 368×288, 34 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Um App-weit Exceptions abzufangen und zu loggen, die man nicht auf dem Schirm hat. So erspart man sich den Standardfehlerdialog, mit dem man als User herzlich wenig anfangen kann. Und man kann zusätzlich Funktionalität einbauen.
    Aus meinem Alltag: Habe über 50 Programme damit ausgestattet und knapp ein Dutzend Leute nutzen diese. Durch diese Art des Fehlerloggings kann ich genau feststellen, wo es zu Fehlern kommt und relativ genau wodurch, um dann Fehlervermeidungscode gezielt einzubauen. Da kommen Probleme zutage, die ich einfach nicht auf dem Schirm als Entwickler habe. Ich mach dann innerhalb des UnhandledExceptionHandlers noch einen Screenshot vom GUI, um dann zu erkennen, welcher Eingabedatenzustand vorlag, um das Problem eingrenzen zu können.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    ​Das ist VS-Einstellungssache....

    Ich habe nun mal gesucht aber noch keinen Hinweis gefunden das zu ändern.

    ABER
    Habe nun mal die "exe" gestartet und den selben Fehler produziert. Versuch auf einen vollen USB-Stick zu kopieren/zippen.
    Das Try/Catch habe ich aus den Copy / Zip Functionen auskommentiert.
    Nun popt die MessageBox auf dem Form wie gewünscht auf.

    So langsam verstehe ich das Prinzip. ;)
    Nur das hier:​System.Threading.ThreadExceptionEventArgs
    Hab ich bis jetzt noch nirgendwo (Tutorials etc) gesehen. Was oder wann kann da(s) passieren?

    ​vorschlag, um Doppelcode zu vermeiden
    Das mache ich jetzt immer dann wenn der ganze Code soweit fertig ist. Dann kopiere ich mir das ganze Projekt in einen neuen Ordner und suche gezielt nach Dopplungen und zu langen Subs/Funktionen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Nur das hier:System.Threading.ThreadExceptionEventArgs
    Hab ich bis jetzt noch nirgendwo (Tutorials etc) gesehen. Was oder wann kann da(s) passieren?
    8| Ich glaub Du weißt nicht, was Du da formuliert hast. Das ist wie die Frage: Was oder wann kann das MainForm passieren? Ergibt keinen Sinn, richtig? ThreadExceptionEventArgs ist ein Informationspaket, welches gebündelt und geschickt wird. Es kann nicht "passieren". Was aber passieren kann: Der Auslöser, der zum Schnüren und Versenden dieses ThreadExceptionEventArgs-Pakets führt.
    Dazu folgendes:
    Der Code, den Du mit den speziell eingebauten EventHandlern nutzt,

    Microsoft Learn schrieb:

    verwendet das ThreadException-Ereignis, um UI-Threadausnahmen zu behandeln, und das UnhandledException-Ereignis, um Nicht-UI-Threadausnahmen zu behandeln.
    Also: Tritt eine unbehandelte Ausnahme im GUI-Thread auf, weil z.B. ein User einen Button geklickt hat und infolgedessen Methoden aufgerufen werden, von denen irgendeine eine Exception auslöst, landet das im ThreadException-EventHandler.
    Wenn aber eine unbehandelte Ausnahme im Nicht-GUI-Thread auftritt (also in einem Nebenthread), landet das im UnhandledException-EventHandler.
    Und wenn wir beide Szenarien kombinieren: Ein User drückt einen Button, daraufhin wird ein Nebenthread gestartet, in dem eine Exception auftritt, dann landet diese nach ersten Tests im ThreadException-EventHandler. Überrascht mich gerade ein wenig, weil ich den anderen vermutet hätte, aber vielleicht hab ich ein schlechtes Szenario gewählt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    schlechtes Szenario gewählt
    Ne das war schon gut für MICH ;)

    Also ein bissel besser hab ich das nun verstanden. Was ich noch nicht so verstanden habe: Wann oder wie weiß ich denn, wann etwas im GUI-Thread oder im nicht-GUI-Thread läuft. OK spätestens dann wenn der Compiler bzgl "Invoken" auf dem GUI meckert??
    Und was ist der Unterschied zwischen "Task und Thread"?

    Szenarien kombinieren..

    Bei meinem Code klick auf Button btnStartCopy auf dem GUI. <== GUI-Tread ?!
    Das Event des Buttons ruft dann eine Sub in der Form-Class (frmMain) und eine Function ( ohne Try/Catch ) in der Class CopyZip auf. <== GUI-Thread und Neben-Tread ?!
    Die Function ruft nun ein Event auf welches auf dem GUI-Thread empfangen wird. z.B. ein Lable aktualisieren. <== Wieder im GUI-Tread ??
    Oder die Function wirft eine Exception ( USB-Stick ist voll ) <== die landet im ==> ThreadException-EventHandler weil ein NebenTread und eben kein expliziter Try/Catch-Block!?

    Soweit einigermaßen richtig wiedergegeben?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Bevor ich da selbst was vom Pferd erzähle, verweise ich mal auf einen Post von @Bluespide bzgl. Thread und Task.

    Amelie schrieb:

    Bei meinem Code klick auf Button btnStartCopy auf dem GUI. <== GUI-Tread ?!
    korrekt

    Amelie schrieb:

    Das Event des Buttons ruft dann eine Sub in der Form-Class (frmMain) und eine Function ( ohne Try/Catch ) in der Class CopyZip auf. <== GUI-Thread und Neben-Tread ?!
    Wahrscheinlich GUI-Thread, wenn Du nicht mit Nebenläufigkeit arbeitest.

    Amelie schrieb:

    Die Function ruft nun ein Event auf welches auf dem GUI-Thread empfangen wird. z.B. ein Lable aktualisieren. <== Wieder im GUI-Tread ??
    korrekt.

    Amelie schrieb:

    Oder die Function wirft eine Exception ( USB-Stick ist voll ) <== die landet im ==> ThreadException-EventHandler weil ein NebenTread und eben kein expliziter Try/Catch-Block!?
    Ja, aber falsche Begründung. Weil es auch im GUI-Thread ist, siehe mein Post oben:

    VaporiZed schrieb:

    Tritt eine unbehandelte Ausnahme im GUI-Thread auf, weil z.B. ein User einen Button geklickt hat und infolgedessen Methoden aufgerufen werden, von denen irgendeine eine Exception auslöst, landet das im ThreadException-EventHandler.
    Wenn aber eine unbehandelte Ausnahme im Nicht-GUI-Thread auftritt (also in einem Nebenthread), landet das im UnhandledException-EventHandler.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Ich hab mal die Auszüge gepostet.
    Die Funktion ​CallCopy() läuft doch im "NebenTread" oder :?:
    Wenn darin nun eine Exception geworfen wird landet diese im:​ThreadException-EventHandler weil in der Funktion eben kein Try/Catch vorhanden ist der das sonst abfangen würde :?:

    Den link zum Thema Task/Tread lese ich später mal!

    Spoiler anzeigen

    frmMain:

    VB.NET-Quellcode

    1. Private Sub btnCopy_Click(sender As Object, e As EventArgs) Handles btnCopy.Click
    2. DisabledControls()
    3. copyzip.Threadsstarten(drivehelper.SelectedCopyType)
    4. End Sub

    clsCopyZip:

    VB.NET-Quellcode

    1. Friend Sub Threadsstarten(SelectedCopytype As Integer)
    2. If propertyValues.IsDriveReady(propertyValues.SourcePath) AndAlso propertyValues.IsDriveReady(propertyValues.TargetCopyPath) AndAlso propertyValues.IsDriveReady(propertyValues.TargetZipPath) Then
    3. Select Case SelectedCopytype
    4. Case Is = 0
    5. KopiereAsync()
    6. Case Is = 1
    7. ZippAsync()
    8. Case Is = 2
    9. KopiereZipAsync()
    10. End Select
    11. Else
    12. RaiseEvent MeldungsID(Meldung.Failure, propertyValues.errorHdd)
    13. End If
    14. End Sub
    15. Private Async Sub KopiereAsync()
    16. Await Threading.Tasks.Task.Run(Function() CallCopy())
    17. RaiseEvent MeldungsID(Meldung.Copy, Nothing)
    18. End Sub
    19. Private Function CallCopy() As Boolean
    20. Dim NewQuelle As New IO.DirectoryInfo(propertyValues.SourcePath), file As IO.FileInfo
    21. If IO.Directory.Exists(propertyValues.TargetCopyPath) = False Then IO.Directory.CreateDirectory(propertyValues.TargetCopyPath)
    22. For Each file In NewQuelle.GetFiles()
    23. RaiseEvent CopyFileReport(propertyValues.TargetCopyPath & "\" & file.Name)
    24. IO.File.Copy(file.FullName.ToString, propertyValues.TargetCopyPath & "\" & file.Name.ToString, True)
    25. Next
    26. For Each subdir In NewQuelle.GetDirectories()
    27. Call Subfoldercopy(subdir.FullName.ToString, propertyValues.TargetCopyPath & "\" & subdir.Name.ToString, True)
    28. Next
    29. Return True
    30. End Function



    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Jou, das Microsoft-Beispiel verrät: Unhandled-ExceptionHandling kommt bei einer Neben-Thread-Exception. Await Threading.Tasks.Task.Run scheint nicht zwangsläufig einen eigenständigen Thread zu starten. Bin aber nicht genügend in der Materie drin, um es erklären zu können.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Amelie schrieb:

    Die Funktion CallCopy() läuft doch im "NebenTread" oder?
    Jou - täte ich denken.
    Aber man weiss ja nicht, wo da deine Ex geworfen wird - vlt. im Handler vom RaiseEvent - und vlt. ist der wieder im Mainthread unterwegs - kann mans wissen?
    Eine Ausgabe von Exception.ToString() täte vlt sachdienliche Hinweise geben können.
    @ErfinderDesRades

    Meinst du das hier: ex.TargetSite :?:
    Hatte das mal in meine kleine "Log.dll" mit eingebaut.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Namespace EventExceptionRecorder
    2. ' Definiert die verschiedenen Log-Level
    3. Public Enum LogLevel
    4. Debug
    5. Info
    6. Success
    7. Warning
    8. Failure ' "Failure" als Ersatz für "Error"
    9. Critical
    10. End Enum
    11. ' Definiert die verschiedenen Detailoptionen für eine Exception
    12. Public Enum ExceptionDetail
    13. Message ' Die Fehlermeldung der Exception
    14. StackTrace ' Der Aufrufstapel (Stack Trace) zum Zeitpunkt des Fehlers
    15. Source ' Die Quelle der Exception
    16. TargetSite ' Die Methode, die die Exception ausgelöst hat
    17. InnerException ' Eine möglicherweise vorhandene innere Exception
    18. Data ' Benutzerdefinierte Informationen zur Exception
    19. End Enum
    20. ' Legt fest, in welchem Format die Log-Nachrichten gespeichert werden sollen
    21. Public Enum LogFormat
    22. txt ' Plain-Text mit Kategorie
    23. xml ' XML "1.0", "utf-8"
    24. End Enum
    25. End Namespace



    @VaporiZed
    Den Artikel habe ich auch gelesen und nicht wirklich viel "schlauer" daraus geworden. Ich muss das auch erst immer von C# => Vb.net konvertieren, was ich auf anhieb nicht verstehe.

    Nun ja, mein kleines Programm läuft erstmal ohne Try/Catch. Teste das jetzt noch mir vielen absichtlichen Fehlern um zu sehen wie das alles abläuft und die Fehler "aufgefangen" werden.
    Dann geht es daran den Code zu "säubern/verkürzen" usw. :)

    Werde mich dann im nächsten kleinen Projekt weiter damit beschäftigen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Ich muss das auch erst immer von C# => Vb.net konvertieren, was ich auf anhieb nicht verstehe.
    Warum einfach, wenn es auch kompliziert geht? Stell einfach die Programmiersprache um, siehe Anhang :rolleyes:
    Bilder
    • LanguageSelection.png

      53,08 kB, 1.323×634, 28 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.