Fehlerbehandlung: Gibt es Verbesserungsmöglichkeiten?

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

Es gibt 50 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    @Amelie Nicht vorher zerlegen!
    Irgendwann willst Du mehr ausgeben, da sind die Parameter bereits vorhanden.
    - Exception-Type (z.B. FileNotFoundException)
    - InnerException

    VB.NET-Quellcode

    1. Public Sub ExceptionToFile(ex as Exception)
    2. File.AppendAllText(MyLogFile, ex.Message)
    3. File.AppendAllText(MyLogFile, Environment.NewLine)
    4. End Sub
    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!
    @VaporiZed
    Hier fülle ich die Combos. Und ja das Selectet Item der Combos ist ans Binding gebunden. Später wird dann das jeweilige Selectet Item in die XML geschrieben.

    VB.NET-Quellcode

    1. Private Sub Festplattenauflisten()
    2. For Each hdd As DriveInfo In HDDS
    3. If hdd.IsReady = True Then
    4. Cmb_zielhdd.Items.Add(hdd.Name)
    5. Cmb_temphdd.Items.Add(hdd.Name)
    6. Cmb_quellhdd.Items.Add(hdd.Name)
    7. Cmb_arbeitshdd.Items.Add(hdd.Name)
    8. End If
    9. Next
    10. End Sub


    @RodFromGermany
    Oh das werde ich mal durchlesen ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ok, dann hat es sich erledigt. Wenn das SelectedItem gebunden ist, ist das eine Sache. Ich dachte, dass die ComboBoxen an sich an BindingSources gebunden sind, also DisplayMember und ValueMember.
    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.
    Problem mit der Fehlerbehandlung.
    Mein Prog soll mir Ordner auf einer Festplatte bzw USB Stick anlegen. In meinem Setting.XML ist alles richtig gespeichert.

    Testumgebung: USB-CARDReader mit SDKarte wurde ausgewählt und in den Settings gespeichert. Ziehe ich nun die SD-Karte raus und lasse die Ordner anlegen kommt Folgende Meldung.
    Siehe Bildangabe.
    Jenachdem welchen Button ich da nun klicke passiert etwas unterschiedliches. Siehe mein Logfile.
    Das Programm läuft trotz Fehler immer in den Abschnitt: Ordner erstellt...

    Jetzt 2 Fragen:
    Wie kann ich das erste Fehlerfenster verhindern? Warum läuft mein Code falsch?

    Spoiler anzeigen

    Das Logfile
    30.04.2022-09.45 - Daten wurden gespeichert
    30.04.2022-09.45 - Die Anforderung wurde abgebrochen.
    30.04.2022-09.45 - Ordner auf HDD G:\ erstellt.
    30.04.2022-09.45 - Das Gerät ist nicht bereit.
    30.04.2022-09.45 - Ordner auf HDD G:\ erstellt.

    VB.NET-Quellcode

    1. #Region "Verzeichnisse anlegen"
    2. Private Sub VerzeichnisseErstellen()
    3. Try
    4. For Each item In LWBuchstaben
    5. If Not IO.Directory.Exists(workhdd & item) Then IO.Directory.CreateDirectory(workhdd & item)
    6. Next
    7. savesuccess = True
    8. Catch ex As Exception
    9. ExceptionToFile(ex.Message)
    10. End Try
    11. End Sub
    12. Private Sub VerzeichnisseOK()
    13. If savesuccess Then
    14. Lbl_hinweise.Visible = True
    15. Lbl_hinweise.Text = "Ordner auf HDD " & workhdd & " erstellt."
    16. ExceptionToFile("Ordner auf HDD " & workhdd & " erstellt.")
    17. Timer1.Start()
    18. Else
    19. Fehlerbehandlung()
    20. End If
    21. End Sub
    22. #End Region
    23. Private Sub Fehlerbehandlung()
    24. If MessageBox.Show("Ein Fehler ist aufgetreten." & Environment.NewLine & "Die LogDatei öffnen?", "Hinweis", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = DialogResult.Yes Then
    25. System.Diagnostics.Process.Start("Logfile.txt")
    26. End If
    27. End Sub

    Bilder
    • Fehler-1.jpg

      127,79 kB, 487×373, 21 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    2 Methoden, die irgendwie irgendwo in irgendeiner Reihenfolge aufgerufen werden … Spekulatius pur. Da mal bitte die Methode posten, die diese Methoden aufruft.
    savesuccess solltest Du zu Beginn der VerzeichnisseErstellen erstmal auf False setzen. Vielleicht ist es anfänglich von einem alten Vorgang falsch positiv, also noch auf True gestellt.
    savesuccess ist aber für diesen Fall ein schlechter Name, da wird ja gar nix gespeichert. Verwendest Du die Variable für unterschiedliche Zwecke mehrfach?

    Naja, und ExceptionToFile("Ordner auf HDD " & workhdd & " erstellt.") - Der Text klingt nicht nach einer Exception, aber das ist zweitrangig.
    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.
    ​savesuccess habe ich mit einer neuen ​dirsuccess erweitert und noch das False zu Begin der ​VerzeichnisseErstellen reingesetzt.
    War wohl so das sich da die Methoden ​speichern der Setting.xml und dem Verzeichnisserstellenin die Quere kamen.
    Hätte ich erkennen können ;( .. Naja das klappt jetzt.

    ​Der Text klingt nicht nach einer Exception, aber das ist zweitrangig
    Ist erstmal nur so für mich um den Umgang mit Files schreiebn etc zu üben.

    Wie aber mache ich es mit der zweiten Meldung / Fenster? Kann man das irgendwie verhindern?


    Spoiler anzeigen

    VB.NET-Quellcode

    1. #Region "Verzeichnisse anlegen"
    2. Private Sub Btn_createdirs_Click(sender As Object, e As EventArgs) Handles Btn_createdirs.Click
    3. VerzeichnisseErstellen()
    4. VerzeichnisseOK()
    5. End Sub
    6. Private Sub VerzeichnisseErstellen()
    7. dirsuccess = False
    8. Try
    9. For Each item In LWBuchstaben
    10. If Not IO.Directory.Exists(workhdd & item) Then IO.Directory.CreateDirectory(workhdd & item)
    11. Next
    12. dirsuccess = True
    13. Catch ex As Exception
    14. ExceptionToFile(ex.Message)
    15. End Try
    16. End Sub
    17. Private Sub VerzeichnisseOK()
    18. If dirsuccess Then
    19. Lbl_hinweise.Visible = True
    20. Lbl_hinweise.Text = "Ordner auf HDD " & workhdd & " erstellt."
    21. ExceptionToFile("Ordner auf HDD " & workhdd & " erstellt.")
    22. Timer1.Start()
    23. Else
    24. Fehlerbehandlung()
    25. End If
    26. End Sub
    27. #End Region
    28. #Region "Fehlerbehandlung"
    29. Public Sub ExceptionToFile(ByVal ExceptionMessage As String)
    30. File.AppendAllText(MyLogFile, MyDatum & " - " & ExceptionMessage)
    31. File.AppendAllText(MyLogFile, Environment.NewLine)
    32. End Sub
    33. Private Sub Fehlerbehandlung()
    34. If MessageBox.Show("Ein Fehler ist aufgetreten." & Environment.NewLine & "Die LogDatei öffnen?", "Hinweis", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = DialogResult.Yes Then
    35. System.Diagnostics.Process.Start("Logfile.txt")
    36. End If
    37. End Sub
    38. #End Region

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Diese Meldung klingt sehr nach einem Systemdialog. Ich vermute mal, dass Du beim Auftreten der Meldung zwar in Visual Studio den Pause-Knopf drücken kannst, aber dann eine Meldung kommt, die sowas besagt wie:

    Quellcode

    1. Anwendung im Haltemodus - es kann kein Usercode angezeigt werden, da momentan kein Usercode ausgeführt wird.

    Da Du in Zeile#14 alle Exceptions ungefiltert abfängst, wird das an der Stelle wohl keine Exception geben. Oder besser: keine normale, sondern ein besonderer Typ, der anders abgefangen werden muss.
    Wann genau tritt diese Meldung auf?
    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.
    Die Meldung taucht dann auf, wenn ich die SD-Karte herrausziehe und dann auf den Button "Btn_createdirs" klicke.

    ​eine Meldung kommt, die sowas besagt wie:
    Eine ähnliche Meldung kommt bei mir.

    Das Verhalten mit der 2ten Meldung tritt aber auch auf wenn ich die exe direkt aufrufe.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Was meinst Du mit 2ter Meldung? Bitte Screenshot posten.
    Du kannst mal versuchen, ob Du an diese Bitte-Karte-einlegen-Meldung kommst, indem Du den UnhandledExceptionHandler verwendest: Projekteigenschaften -> Anwendung -> den Button [Anwendungsereignisse anzeigen] klicken; dann oben mittig im Code-Editor (MyApplication Ereignisse) auswählen und rechts oben dann UnhandledException. Dann wird ein EventHandler erzeugt, der aufgerufen wird, wenn nicht behandelte Exceptions auftreten. In diese Methode schreibst Du erstmal nur Stop rein. Dann hält der Compiler an, wenn solch ein Fall auftritt. Probier mal, ob damit die Meldung erstmal abfangbar ist.

    Falls das in Deiner VS-Version so nicht geht, schreib ansonsten einfach am Ende Deiner MainForm-Datei (also nach End Class):

    VB.NET-Quellcode

    1. Namespace My
    2. Partial Friend Class MyApplication
    3. Private Sub MyApplication_UnhandledException(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
    4. Stop
    5. End Sub
    6. End Class
    7. End Namespace

    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“ ()

    Post #24 Das Bild: => Bitte Screenshot posten
    Das andere von dir Teste ich gleich.

    EDIT: 12:00

    In beiden Fällen kommt die o.g. 2te Meldung und in meinem LogFile wird dann: "Gerät ist nicht bereit" eingetragen wenn ich auf WEITER klicke.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Hält der Compiler innerhalb der Methode MyApplication_UnhandledException bei dem Wort Stop an oder 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.
    Leider hab ich noch keine Möglichkeit gefunden, das Problem ohne SD-Karte zu reproduzieren.
    Mein Versuch: USB-Stick reinstecken und

    VB.NET-Quellcode

    1. Private Directory As New IO.DirectoryInfo("E:\")
    2. Private Sub Btn_createdirs_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. For i = 1 To 5
    4. Directory = Directory.CreateSubdirectory("1")
    5. MessageBox.Show("done")
    6. Next
    7. End Sub

    Und wenn eine MessageBox auftaucht, dann Stick rausziehen und [OK]. Leider kommt - wie zu erwarten - einfach Ein Ausnahmefehler des Typs "System.IO.DirectoryNotFoundException" ist in mscorlib.dll aufgetreten.
    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.
    Ich habe etwas herrausgefunden:
    Mit einem USB Stick habe ich auch gerabeitet, da verhielt sich das ganz anders als mit meinem CardReader.

    Es liegt wohl daran, das mein Cardreader so ein Portabler USB ist. Der macht dann 2 neue LW im Explorer, weil man da normale und Micro SDKarten reinstecken kann.
    Jetzt macht es aber einen Unterschied, ob ich " nur " die SDKarte rausziehe oder den ganzen Cardreader.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Also das mit der Fehlerbehandlung ( dem 2ten Fenster ) geht wohl nicht anders.
    Habe in dem Zusammenhang ein weiteres Problemchen; die Aktualisierung der Comboboxen.
    Erstmal der Code:

    Spoiler anzeigen

    'Prüfen ob neues LW dazukommt oder wegfällt. Klappt!

    VB.NET-Quellcode

    1. Private Const WM_DEVICECHANGE As Integer = &H219
    2. Private Const DBT_DEVICEARRIVAL As Integer = &H8000
    3. Private Const DBT_DEVICEREMOVECOMPLETE As Integer = &H8004
    4. #Region "DeviceWechsel"
    5. Protected Overloads Overrides Sub WndProc(ByRef msg As Message)
    6. MyBase.WndProc(msg)
    7. Dim wParam = msg.WParam.ToInt32()
    8. If msg.Msg = WM_DEVICECHANGE Then
    9. If wParam = DBT_DEVICEARRIVAL Then
    10. Festplattenauflisten()
    11. Lbl_hinweise.Visible = True
    12. Lbl_hinweise.Text = ("Ein neues Gerät wurde angeschlossen.")
    13. Timer1.Start()
    14. ElseIf wParam = DBT_DEVICEREMOVECOMPLETE Then
    15. Festplattenauflisten()
    16. Lbl_hinweise.Visible = True
    17. Lbl_hinweise.Text = ("Ein Gerät wurde abgezogen.")
    18. Timer1.Start()
    19. End If
    20. End If
    21. End Sub
    22. #End Region

    'Auflistung der Festplatte in den Comboboxen

    VB.NET-Quellcode

    1. #Region "HDDs auflisten"
    2. Private Sub Festplattenauflisten()
    3. For Each Cmb In GroupBox1.Controls.OfType(Of ComboBox)()
    4. Cmb.Items.Clear()
    5. Next
    6. For Each hdd As DriveInfo In MyApp.HDDS
    7. If hdd.IsReady = True Then
    8. For Each Cmb In GroupBox1.Controls.OfType(Of ComboBox)()
    9. Cmb.Items.Add(hdd.Name)
    10. Next
    11. End If
    12. Next
    13. End Sub


    Jetzt zum Verhalten vom Programm.
    Wenn ich nun einen USB-Stick oder mein USB-CardReader einstecke, werden die Combos "gecleart" und die Liste der Laufwerke neu geschrieben ABER der USB-Stick NICHT mit aufgelistet.

    Starte ich das Programm, während der USB-Stick schon eingesteckt ist, wird er aufgelistet. Ziehe ich den ab, ist er aus der Liste raus. Stecke ich den nun wieder ein, ist er auch wieder in der Liste drin.

    hmmm... Hoffe Ihr versteht das Verhalten und könnt helfen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Zum Problem: Was ist HDDS und wie wird es befüllt? Wenn zu Programmstart der USB-Stick nicht drinsteckt, wird es wohl nicht in HDDS drin sein und kann später auch nicht gelistet werden.

    Ganz kurz: Dein Code

    VB.NET-Quellcode

    1. If msg.Msg = WM_DEVICECHANGE Then
    2. If wParam = DBT_DEVICEARRIVAL Then
    3. Festplattenauflisten()
    4. Lbl_hinweise.Visible = True
    5. Lbl_hinweise.Text = ("Ein neues Gerät wurde angeschlossen.")
    6. Timer1.Start()
    7. ElseIf wParam = DBT_DEVICEREMOVECOMPLETE Then
    8. Festplattenauflisten()
    9. Lbl_hinweise.Visible = True
    10. Lbl_hinweise.Text = ("Ein Gerät wurde abgezogen.")
    11. Timer1.Start()
    12. End If
    13. End If

    3 Zeilen wiederholen sich und sollten daher aus dem If-Statement raus, also vor das If oder nach dem End If

    Dein Code:

    VB.NET-Quellcode

    1. For Each hdd As DriveInfo In MyApp.HDDS
    2. If hdd.IsReady = True Then

    das kannst Du - wenn Du willst - ändern zu:

    VB.NET-Quellcode

    1. For Each hdd As DriveInfo In MyApp.HDDS
    2. If hdd.IsReady Then

    oder

    VB.NET-Quellcode

    1. For Each hdd In MyApp.HDDS.Where(Function(x) x.IsReady)
    2. 'If hdd.IsReady = True Then braucht man dann nicht


    oder (weiß ja nicht, das MyApp.HDDS für ein Datentyp ist.

    VB.NET-Quellcode

    1. For Each hdd In MyApp.HDDS.Cast(Of DriveInfo).Where(Function(x) x.IsReady)
    2. 'If hdd.IsReady = True Then braucht man dann 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.
    ​MyApp.HDDs ===> Property HDDS As DriveInfo() = DriveInfo.GetDrives()
    Gibt es denn eine Möglichkeit den Stick dann hinzuzufügen?
    Nach meiner Logic müsste ich das "DriveInfo().." nur neu aufrufen, aber wie????????
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Diese Property muss immer dann aktualisiert werden, wenn sich die Datenträger ändern. Du hast doch Code, der das An- und Abstöpseln überwacht. Sobald sich da was tut, muss der Code inhaltlich wieder ausgeführt werden, also HDDS = DriveInfo.GetDrives(). Ggf. wär es auch sinnvoll in einer ListBox anzeigen zu lassen, welche aktuellen Laufwerke gerade bekannt sind und diese Liste immer zu aktualisieren, wenn sich was ändert.
    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.
    OK, Habe das nun so gelößt.
    Das mit der Listbox hatte ich in einer anderen Version mal drin, bevor ich mit den Comboboxen begonnen hatte.

    VB.NET-Quellcode

    1. Private Sub Festplattenauflisten()
    2. Dim HDDS As DriveInfo() = DriveInfo.GetDrives()
    3. For Each Cmb In GroupBox1.Controls.OfType(Of ComboBox)()
    4. Cmb.Items.Clear()
    5. Next
    6. For Each hdd In HDDS.Where(Function(x) x.IsReady)
    7. For Each Cmb In GroupBox1.Controls.OfType(Of ComboBox)()
    8. Cmb.Items.Add(hdd.Name)
    9. Next
    10. Next
    11. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @VaporiZed

    Habe nun meinen Code für Verzeichnisse erstellen fertig.
    Wäre das so ( halbwegs ) OK?

    Spoiler anzeigen

    In der Klasse:

    VB.NET-Quellcode

    1. Property MyLogFile As String
    2. Friend Sub LogFileDatum()
    3. Dim LogDatum As String = Date.Now.ToString("MM.yyyy")
    4. MyLogFile = "Logfile_" & LogDatum & ".txt"
    5. End Sub
    6. #Region "Fehlerbehandlung"
    7. Friend Function IsDriveReady(ByVal SDdrive As String) As Boolean
    8. Try
    9. Dim SDrive As New System.IO.DriveInfo(SDdrive)
    10. Return SDrive.IsReady
    11. Catch ex As Exception
    12. Return False
    13. End Try
    14. End Function
    15. Friend Sub Fehlerbehandlung()
    16. If MessageBox.Show("Ein Fehler ist aufgetreten." & Environment.NewLine & "Die LogDatei öffnen?", "Hinweis", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = DialogResult.Yes Then
    17. System.Diagnostics.Process.Start(MyLogFile)
    18. End If
    19. End Sub
    20. Friend Sub ExceptionToFile(ByVal ExceptionMessage As String)
    21. File.AppendAllText(MyLogFile, DatumImLogfile & " - " & ExceptionMessage)
    22. File.AppendAllText(MyLogFile, Environment.NewLine)
    23. End Sub
    24. #End Region

    In dem Form:

    VB.NET-Quellcode

    1. #Region "Verzeichnisse anlegen"
    2. Private Sub VerzeichnisseErstellen()
    3. If MyApp.IsDriveReady(MyApp.BackUp) Then
    4. DirectoryCreateOK = False
    5. For Each item In MyApp.LWBuchstaben
    6. If Not IO.Directory.Exists(MyApp.BackUp & item) Then IO.Directory.CreateDirectory(MyApp.BackUp & item)
    7. Next
    8. DirectoryCreateOK = True
    9. Else
    10. MyApp.ExceptionToFile("Das Laufwerk " & MyApp.BackUp & " ist nicht bereit.")
    11. MyApp.Fehlerbehandlung()
    12. End If
    13. If DirectoryCreateOK Then
    14. Lbl_hinweise.Visible = True
    15. Lbl_hinweise.Text = "Ordner auf HDD " & MyApp.BackUp & " erstellt."
    16. MyApp.ExceptionToFile("Ordner auf HDD " & MyApp.BackUp & " erstellt.")
    17. Timer_HinweiseAusblenden.Start()
    18. End If
    19. End Sub
    20. #End Region

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: