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.

    VB.NET-Quellcode

    1. If Not IO.Directory.Exists(MyApp.BackUp & item) Then IO.Directory.CreateDirectory(MyApp.BackUp & item)

    Du kannst dir hier die If-Abfrage sparen einfach nur Directory.CreateDirectory denn wenn die Directory bereits existiert wird keine Erstellt.

    Siehe: docs.microsoft.com/de-de/dotne…atedirectory?view=net-6.0
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    VB.NET-Quellcode

    1. Friend Function IsDriveReady(ByVal SDdrive As String) As Boolean
    2. Try
    3. Dim SDrive As New System.IO.DriveInfo(SDdrive)
    4. Return SDrive.IsReady
    5. Catch ex As Exception
    6. Return False
    7. End Try
    8. End Function
    ->

    VB.NET-Quellcode

    1. Friend Function IsDriveReady(ByVal SDdrive As String) As Boolean
    2. Try
    3. Return New System.IO.DriveInfo(SDdrive).IsReady
    4. Catch ex As Exception
    5. Return False
    6. End Try
    7. End Function


    VB.NET-Quellcode

    1. Friend Sub ExceptionToFile(ByVal ExceptionMessage As String)
    2. File.AppendAllText(MyLogFile, DatumImLogfile & " - " & ExceptionMessage)
    3. File.AppendAllText(MyLogFile, Environment.NewLine)
    4. End Sub
    ->

    VB.NET-Quellcode

    1. Friend Sub ExceptionToFile(ByVal ExceptionMessage As String)
    2. File.AppendAllText(MyLogFile, DatumImLogfile & " - " & ExceptionMessage & Environment.NewLine)
    3. End Sub

    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.
    Hier geht es um den Punkt: 'Auswahl Kopieren und Zippen

    Ich weiß nicht so recht wie ich das Händeln soll. Im Moment ist es so, das zwar die Fehlermeldung kommt, das ein Laufwerk nicht bereit ist aber je nachdem wird dann trotzdem kopiert oder gezippt.

    Fragen:
    1.) kann man den Code besser schreiben?
    2.) zulassen das bei Fehler zumindest dann ein ausgeführt wird oder beides unterbinden?


    Spoiler anzeigen

    Im Form ( könnte ich ggf noch aus dem Sub vom Button auslgern ?? )

    VB.NET-Quellcode

    1. Private Sub Btn_CopyZipp_Click(sender As Object, e As EventArgs) Handles Btn_CopyZipp.Click
    2. Dim txtempty As Boolean = String.IsNullOrWhiteSpace(TxBox_Bezeichnung.Text)
    3. If txtempty Then
    4. Lbl_Meldungen.Visible = True
    5. Lbl_Meldungen.Text = "Feld Bezeichnung darf nicht leer sein."
    6. Timer_Meldungstexte.Start()
    7. Else
    8. Btn_CopyZipp.Enabled = False
    9. TxBox_Quellverzeichnis.Enabled = False
    10. TxBox_Bezeichnung.Enabled = False
    11. ListBox_Copyfiles.Items.Clear()
    12. KLASS.Threadsstarten(KLASS.AuswahlCopyZip)
    13. End If
    14. End Sub

    In der Klasse

    VB.NET-Quellcode

    1. Friend Sub Threadsstarten(ByVal Auswahl As Integer)
    2. Select Case Auswahl
    3. Case Is = 0
    4. 'Auswahl nur kopieren
    5. If IsDriveReady(Newsource) AndAlso IsDriveReady(Backup_Laufwerk) Then
    6. RaiseEvent MeldungsID(3)
    7. KopiereAsync()
    8. Else
    9. RaiseEvent MeldungsID(4)
    10. ExceptionToFile("Fehler: Ein Laufwerk ist nicht bereit.")
    11. Fehlerbehandlung()
    12. End If
    13. Case Is = 1
    14. 'Auswahl nur Zippen
    15. If IsDriveReady(Newsource) AndAlso IsDriveReady(Zip_Laufwerk) Then
    16. RaiseEvent MeldungsID(3)
    17. ZippAsync()
    18. Else
    19. RaiseEvent MeldungsID(4)
    20. ExceptionToFile("Fehler: Ein Laufwerk ist nicht bereit.")
    21. Fehlerbehandlung()
    22. End If
    23. Case Is = 2
    24. 'Auswahl Kopieren und Zippen
    25. If IsDriveReady(Newsource) OrElse IsDriveReady(Backup_Laufwerk) OrElse IsDriveReady(Zip_Laufwerk) Then
    26. RaiseEvent MeldungsID(3)
    27. ZippAsync()
    28. KopiereAsync()
    29. Else
    30. RaiseEvent MeldungsID(4)
    31. Fehlerbehandlung()
    32. ExceptionToFile("Fehler: Ein Laufwerk ist nicht bereit.")
    33. End If
    34. End Select
    35. End Sub



    Später habe ich noch eine Frage hierzu:
    Codeausschnitt!

    VB.NET-Quellcode

    1. If File.Exists(Newziel & ".zip") Then
    2. My.Computer.FileSystem.RenameFile(Newziel & ".zip", Newname & "_" & Anzahlzips & "_.zip")
    3. End If


    @VaporiZed

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

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

    Also KLASS.Threadsstarten(KLASS.AuswahlCopyZip) ist … naja. Deine Klasse kennt doch ihre eigene Variable selbst, daher musst Du die nicht extra an sie übergeben. Also

    VB.NET-Quellcode

    1. KLASS.Threadsstarten()
    2. Friend Sub Threadsstarten()
    3. Select Case AuswahlCopyZip


    Case Is = X -> Case X

    Wird AuswahlCopyZip im Form oder in der Klasse festgelegt?
    Statt eine Meldung mit MeldungsID als Event zu senden, könnte es sinnvoller sein, einmal ein SuccessEvent und einmal ein FailEvent zu schicken. Ist intuitiver. Weil sonst ja das Form/der EventHandler wählen müsste, was jetzt welche ID zu bedeuten hat.

    Wenn ExceptionToFile nur in dieser Sub auftaucht, sollte sich ebenfalls der EventHandler darum kümmern. Es ist eigentlich nicht die Aufgabe Deine Klasse, sowas zu loggen.

    Und welche Frage hast Du? Statt My.Computer.FileSystem.RenameFile solltest Du IO.File.Move verwenden. Gleiche Wirkung, aber Du kannst ein weiteres mal auf den "Paria#2-Namespace" verzichten. (Paria#1 wäre Microsoft.VisualBasic)
    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.
    Moin moin

    Es ging mir jetzt mehr ums Händling. Was tun wenn ein Fehler bei einem von zwei Festplatten auftritt?
    Zulassen das bei Fehler zumindest dann eins ausgeführt wird oder beides unterbinden

    Das mit IO.Move kannte ich so nicht, ändere ich dann.
    Zu meinem anderen Problem:
    Es kann vorkommen, das ich bei einem Kopieren/Zippen 2 oder 3 SDKarten/USB-Sticks kopieren muss. Dann wir ja immer ein Zip-Ordner erstellt.
    Bei 2 klappt der u.g. Code aber bei 3 oder 4 versagt der Code. Mir fehlt nun die Idee usw wie ich das Händeln kann.

    Die Zip-Ordner sehen dann so aus: 24 April 2022.zip // 24 April 2022_1_.zip der nächste müßte dann 24 April 2022_2_.zip werden. Da bekomme ich aber die Meldung das die Datei schon vorhanden ist. hmmmm???
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function Datenzippen() As Boolean
    2. Dim Anzahlzips As Integer
    3. If File.Exists(Newziel) Then
    4. Anzahlzips = New IO.DirectoryInfo(Newname).GetDirectories("*", IO.SearchOption.AllDirectories).Select(Function(x) x.GetFiles(".zip")).Count
    5. End If
    6. Try
    7. Anzahlzips = Anzahlzips + 1
    8. If Not Directory.Exists(Newziel) Then Directory.CreateDirectory(Newziel)
    9. If File.Exists(Newziel & ".zip") Then
    10. My.Computer.FileSystem.RenameFile(Newziel & ".zip", Newname & "_" & Anzahlzips & "_.zip")
    11. End If
    12. RaiseEvent ZipFileReport(Newname)
    13. ZipFile.CreateFromDirectory(Newsource, Newziel & ".zip", CompressionLevel.Optimal, False)
    14. IO.Directory.Delete(Newziel)
    15. Return True
    16. Catch ex As Exception
    17. ExceptionToFile(ex.Message)
    18. Fehlerbehandlung()
    19. Return False
    20. End Try
    21. End Function

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

    Amelie schrieb:

    Was tun wenn ein Fehler bei einem von zwei Festplatten auftritt?
    Zulassen das bei Fehler zumindest dann eins ausgeführt wird oder beides unterbinden
    Es ist Dein Programm, entscheide selbst. Ich würd es wohl durchgehen lassen. Besser eine Datensicherung als keine.

    Amelie schrieb:

    Bei 2 klappt der u.g. Code aber bei 3 oder 4 versagt der Code.
    Wie wär es mit einer adäquaten For-Schleife, die von 1 bis AnzahlDerKarten geht und nach dem Try beginnt und vor dem Catch aufhört?
    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.
    ​Besser eine Datensicherung als keine.
    Hatte ich schon so gemacht, dachte mir auch das es besser sei. Zumal mir gerade eine Platte kaputtgegangen ist. 3 Partitionen und 2 nicht mehr lesbar ;(

    OK Das mit der For Schleife werde ich mal versuchen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @VaporiZed
    Nochmal Fehlerbehandlung, hänge am RaiseEvent von eine Form in eine andere Form.
    Fehlermeldung in Form2:
    ​Fehler 1 Die Signatur der Private Sub MySaveEvent(sender As Object, e As MeldungEventArgs)-Methode ist mit dem Delegaten "Delegate Sub MeldungsIDEventHandler(MeldungID As Integer)" nicht kompatibel.

    Spoiler anzeigen

    Class:

    VB.NET-Quellcode

    1. Public Class MeldungEventArgs
    2. Inherits EventArgs
    3. Public Property MeldungsID As Integer
    4. Sub New()
    5. End Sub
    6. End Class

    MainForm

    VB.NET-Quellcode

    1. Public Class Frm_Main
    2. Private WithEvents MyAppEvent As New MeldungEventArgs
    3. Public Sub New()
    4. InitializeComponent()
    5. End Sub
    6. Private Sub Mitteilungen(ByVal var As Integer) Handles MeldungsID '<======Hier unterkingelt
    7. Select Case var
    8. Case Is = 1
    9. Lbl_Meldungen.Visible = True
    10. Lbl_Meldungen.Text = "Alle Daten erfolgreich gespeichert."
    11. Timer_Meldungstexte.Start()
    12. End Select
    13. End Sub

    2tes Form

    VB.NET-Quellcode

    1. Private MyApp As New Cls_Main
    2. Friend Event MeldungsID(MeldungID As Integer)
    3. Public Sub New()
    4. InitializeComponent()
    5. AddHandler MeldungsID, AddressOf MySaveEvent '<========Hier unterkringelt
    6. End Sub
    7. Private Sub MySaveEvent(sender As Object, e As MeldungEventArgs)
    8. If Savedaten() Then RaiseEvent MeldungsID(1)
    9. End Sub
    10. Private Sub Btn_SaveFirma_Click(sender As Object, e As EventArgs) Handles Btn_SaveFirma.Click
    11. MySaveEvent() <====???????? Was muss hier hin?
    12. End Sub
    13. Friend Function Savedaten() As Boolean
    14. Try
    15. Me.Validate()
    16. Me.KuVadatenBindingSource.EndEdit()
    17. Me.TableAdapterManager.UpdateAll(Me.KuVaDataSet)
    18. Return True
    19. Catch ex As FileNotFoundException
    20. MyApp.ExceptionToFile(ex.Message)
    21. MyApp.Fehlerbehandlung()
    22. Return False
    23. End Try
    24. End Function

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

    Amelie schrieb:

    Die Signatur der Private Sub ...
    bedeutet, dass die Parameter der Prozedur nicht mit dem Delegaten übereinstimmen.
    Mit 800 Posts im Forum solltest Du allein in der Lage sein, das auszuräumen.
    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!

    Amelie schrieb:

    Friend Event MeldungsID(MeldungID As Integer)
    wie man einen Microsoft-konformen EventHandler schreibt, hab ich Dir bereits geschrieben …
    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.