Programm Logik nach Fehler brauche Ideen

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

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Programm Logik nach Fehler brauche Ideen

    Moin moin

    Ich brauche mal eine Hilfe / Idee wie ich mit einer Fehlerbehandlung weiter umgehen kann / muss / soll.

    Folgendes: Beim Starten des Programmes wird geprüft ob die "Settings.XML" vorhanden ist. Wenn nicht, wird diese mit Default-Werten neu erstellt. Diese Defaultwerte kann / sollte der User dann für seine Zwecke ändern.
    Dazu erstelle ich noch ein Formular, welches die Werte dann in die entsprechenden Felder der Class schreibt.

    Die Load-Class schreibt die Werte dann beim Starten in die Felder der Class und die Eingabe-Textboxen des Forms.

    Zur Frage:
    Wie gehe ich weiter vor, wenn hier: Public Sub GetEnvironmentData()​ ein Fehler auftritt :?:
    Oder hole ich hier die Werte aus den Eingabe-Textboxen und nicht aus der Class :?:

    Oder eine ganz andere Vorgehensweise :?:

    Spoiler anzeigen

    Die Save-Class

    VB.NET-Quellcode

    1. ' Eine Methode zum Speichern der aktuellen Anwendungseinstellungen in einer XML-Datei
    2. Public Class SaveSettings
    3. Private Const SuccessMessage As String = "Die Programm-Konfiguration wurden erfolgreich in {0} gespeichert."
    4. Private Const FailureSaveMessage As String = "Fehler beim Speichern der Programm-Konfiguration in die Datei {0}{1}{2}."
    5. Private Const FailureGetMessage As String = "Fehler beim Laden der Programm-Konfiguration aus der Klasse."
    6. ' Umgebungsvariablen holen
    7. Public Sub GetEnvironmentData()
    8. Try
    9. ' Pfad zur XML-Datei aus der Umgebungsinformationen abrufen
    10. Dim filePath As String = EnvironmentManager.Instance.XmlFilepath
    11. ' Quell- und Ziel-Laufwerke aus der Umgebungsinformationen abrufen
    12. Dim sourceDrive As String = EnvironmentManager.Instance.SourceDrive
    13. Dim targetDrive As String = EnvironmentManager.Instance.TargetDrive
    14. SaveSettings(filePath, sourceDrive, targetDrive)
    15. Catch ex As Exception
    16. ' Fehler protokollieren
    17. GlobalEventLogger.ExceptionToFile(String.Format(FailureGetMessage, NewCrlLf, ex.Message), ExceptionStatus.Failure)
    18. End Try
    19. End Sub
    20. Private Sub SaveSettings(filePath As String, sourceDrive As String, targetDrive As String)
    21. Try
    22. ' Ein neues XmlDocument-Objekt erstellen
    23. Dim xmlDoc As New XmlDocument()
    24. ' Das Wurzelelement für die Einstellungen erstellen
    25. Dim rootNode As XmlNode = xmlDoc.CreateElement("Application")
    26. xmlDoc.AppendChild(rootNode)
    27. ' Das Element für die Laufwerkeinstellungen erstellen
    28. Dim settingsNode As XmlNode = xmlDoc.CreateElement("DriveSettings")
    29. rootNode.AppendChild(settingsNode)
    30. ' Die Quelllaufwerk-Einstellung speichern
    31. Dim sourceNode As XmlNode = xmlDoc.CreateElement("SourceDrive")
    32. sourceNode.InnerText = sourceDrive
    33. settingsNode.AppendChild(sourceNode)
    34. ' Die Ziel-Laufwerk-Einstellung speichern
    35. Dim targetNode As XmlNode = xmlDoc.CreateElement("TargetDrive")
    36. targetNode.InnerText = targetDrive
    37. settingsNode.AppendChild(targetNode)
    38. ' Die XML-Datei speichern
    39. xmlDoc.Save(filePath)
    40. ' Erfolgsmeldung protokollieren
    41. GlobalEventLogger.ExceptionToFile(String.Format(SuccessMessage, filePath), ExceptionStatus.Success)
    42. Catch ex As Exception
    43. ' Fehler protokollieren
    44. GlobalEventLogger.ExceptionToFile(String.Format(FailureSaveMessage, filePath, NewCrlLf, ex.Message), ExceptionStatus.Failure)
    45. End Try
    46. End Sub
    47. End Class


    Die Default-Class

    VB.NET-Quellcode

    1. ' Eine Methode zum Speichern der Standart Anwendungseinstellungen in eine XML-Datei
    2. Public Class DefaultSettings
    3. Private Const SuccessMessage As String = "Die Basis-Konfiguration wurde erfolgreich in {0} gespeichert."
    4. Private Const FailureMessage As String = "Fehler beim Speichern der Basis-Konfiguration in der XML-Datei {0}{1}{2}."
    5. Private Const NewFileMessage As String = "Die Datei für die Programmeinstellungen war nicht vorhanden.{0}Eine neue Datei wurde erstellt."
    6. Public Sub CreateDefaultXmlFile()
    7. ' Pfad zur XML-Datei erstellen
    8. Dim filePath As String = EnvironmentManager.Instance.XmlFilepath
    9. ' Meldung für eine neue Datei protokollieren
    10. GlobalEventLogger.ExceptionToFile(String.Format(NewFileMessage, NewCrlLf), ExceptionStatus.Notice)
    11. Try
    12. ' XML-Datei erstellen
    13. Using writer As New XmlTextWriter(filePath, System.Text.Encoding.UTF8)
    14. writer.Formatting = Formatting.Indented
    15. ' Beginnen des Dokuments
    16. writer.WriteStartDocument()
    17. ' Wurzelelement und Unterlemente erstellen
    18. writer.WriteStartElement("Application")
    19. writer.WriteStartElement("DriveSettings")
    20. writer.WriteElementString("SourceDrive", "C:\")
    21. writer.WriteElementString("TargetDrive", "C:\")
    22. ' Endtag für Elemente schreiben
    23. writer.WriteEndElement()
    24. writer.WriteEndElement()
    25. ' Dokument schließen
    26. writer.WriteEndDocument()
    27. End Using
    28. ' Erfolgsmeldung protokollieren
    29. GlobalEventLogger.ExceptionToFile(String.Format(SuccessMessage, filePath), ExceptionStatus.Success)
    30. Catch ex As Exception
    31. ' Fehler protokollieren
    32. GlobalEventLogger.ExceptionToFile(String.Format(FailureMessage, filePath, NewCrlLf, ex.Message), ExceptionStatus.Failure)
    33. End Try
    34. End Sub
    35. End Class


    Die Load-Class:

    VB.NET-Quellcode

    1. ' Eine Methode zum Laden der Anwendungseinstellungen aus einer XML-Datei
    2. Public Class LoadSettings
    3. Private Const SuccessMessage As String = "Das Laden der Programm-Konfiguration aus der XML-Datei {0} war erfolgreich."
    4. Private Const FailureMessage As String = "Fehler beim Laden der Programm-Konfiguration aus der XML-Datei {0}{1}{2}."
    5. Public Sub LoadSettings()
    6. ' Pfad zur XML-Datei erstellen
    7. Dim filePath As String = EnvironmentManager.Instance.XmlFilepath
    8. Try
    9. ' Ein neues XmlDocument-Objekt erstellen und die XML-Datei laden
    10. Dim xmlDoc As New XmlDocument()
    11. xmlDoc.Load(filePath)
    12. ' Das Element für die Laufwerkeinstellungen auswählen
    13. Dim settingsNode As XmlNode = xmlDoc.SelectSingleNode("//DriveSettings")
    14. If settingsNode IsNot Nothing Then
    15. ' Die Quelllaufwerk-Einstellung laden
    16. Dim sourceDriveNode As XmlNode = settingsNode.SelectSingleNode("SourceDrive")
    17. If sourceDriveNode IsNot Nothing AndAlso Not String.IsNullOrEmpty(sourceDriveNode.InnerText) Then
    18. EnvironmentManager.Instance.SourceDrive = sourceDriveNode.InnerText
    19. Else
    20. EnvironmentManager.Instance.SourceDrive = Nothing
    21. End If
    22. ' Die Ziel-Laufwerk-Einstellung laden
    23. Dim targetDriveNode As XmlNode = settingsNode.SelectSingleNode("TargetDrive")
    24. If targetDriveNode IsNot Nothing AndAlso Not String.IsNullOrEmpty(targetDriveNode.InnerText) Then
    25. EnvironmentManager.Instance.TargetDrive = targetDriveNode.InnerText
    26. Else
    27. EnvironmentManager.Instance.TargetDrive = Nothing
    28. End If
    29. End If
    30. ' Erfolgsmeldung protokollieren
    31. GlobalEventLogger.ExceptionToFile(String.Format(SuccessMessage, filePath), ExceptionStatus.Success)
    32. Catch ex As Exception
    33. ' Fehler protokollieren
    34. GlobalEventLogger.ExceptionToFile(String.Format(FailureMessage, filePath, NewCrlLf, ex.Message), ExceptionStatus.Failure)
    35. End Try
    36. End Sub
    37. End Class




    PS: Ich nutze gerade zum Testen ein Laptop mit Windows 10 und VS 2019 ( Für mich eine Herausforderung :D )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Oder hole ich hier die Werte aus den Eingabe-Textboxen und nicht aus der Class


    Grundsätzlich erstmal den Fehler dem User melden, wenn das Programm aber trotz des Fehlers noch laufbereit ist, du nutzt dann ja Standard-Werte, den User fragen ob er so denn starten möchte. Controls dienen nicht als Speicher, nur zur Ansicht von ... und Interaktion mit dem User.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Diese Einstellungen erzeugen im My Project-Ordner eine Setings.settings die xml-artig diese Werte speichert.
    Außerdem wirds nochmal in die App.config geschrieben, was ich nicht ganz verstehe, warum man das zweimal braucht.

    Und beim Kompilieren wandert es dann in die 'Projektname'.dll.config im Build-Ordner (das ist dann eine Kopie der App.config)
    @Amelie Erstell Dir eine Datenklasse, gib der entsprechende Properties und XML-serialisiere sie.
    Feddich.
    Einstellungen einer App speichern - Textdatei, My.Settings, Registry?
    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!
    Hallo und danke für die vielen Tips.

    Ich glaube ich habe mich nicht richtig ausgedrückt. Habe nun die Class für das speichern umgeschrieben. Das Speichen und laden etc. funktionierte ja schon.
    Mir ging es darum, wenn in der Methode ​Public Sub GetEnvironmentData() warum auch immer mal ein Fehler auftritt, wie ich diesen dann behandele.

    So habe ich es nun erstmal gemacht.
    Die Idee dahinter ist:
    Wenn etwas schief geht, wird ggf beim Neustart die "Settings.xml" mit den Defaultwerten neu erstellt oder mit den alten Werten geladen.

    1.) Bin offen für bessere Ideen :)
    2.) Wie kann ich das mal testen :?:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Eine Methode zum Speichern der aktuellen Anwendungseinstellungen in einer XML-Datei
    2. Public Class SaveManager
    3. ' Eine private, statische Instanz der Klasse, um das Singleton-Muster zu implementieren
    4. Private Shared ReadOnly _instance As New SaveManager()
    5. ' Öffentliche Eigenschaft zum Zugriff auf die Singleton-Instanz
    6. Public Shared ReadOnly Property Instance As SaveManager
    7. Get
    8. Return _instance
    9. End Get
    10. End Property
    11. ' Ereignis, das ausgelöst wird, wenn das Speicher erfolgreich war.
    12. Public Event SaveSuccesfull As EventHandler(Of EventClasses.SaveSuccesfullEventArgs)
    13. ' Meldungstexte
    14. Private Const SuccessMessage As String = "Die Programm-Konfiguration wurden erfolgreich in {0} gespeichert."
    15. Private Const FailureSaveMessage As String = "Fehler beim Speichern der Programm-Konfiguration in die Datei {0}{1}{2}."
    16. Private Const FailureGetMessage As String = "Fehler beim Laden der Programm-Konfiguration aus der Klasse."
    17. Private Const SaveMessage As String = "Das Speichern der Daten war erfolgreich."
    18. Private Const RestartMessage As String = "Es ist ein Fehler aufgetreten. Die Anwendung wird neu gestartet.{0}Schauen Sie ggf. in die LogDatei für weitere Hinweise auf den Fehler"
    19. ' Anzeigen einer MessageBox mit einer Fehlermeldung und dem Neustart
    20. Private Sub HandleErrorAndRestart()
    21. MessageBox.Show(String.Format(RestartMessage, NewCrlLf), "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    22. ' Anwendung neu Starten und dabei ggf mit den Defaultwerten / alten Werten laden
    23. Application.Restart()
    24. End Sub
    25. ' Umgebungsvariablen holen
    26. Public Sub GetEnvironmentData()
    27. Try
    28. ' Pfad zur XML-Datei aus der Umgebungsinformationen abrufen
    29. Dim filePath As String = EnvironmentManager.Instance.XmlFilepath
    30. ' Quell- und Ziel-Laufwerke aus der Umgebungsinformationen abrufen
    31. Dim sourceDrive As String = EnvironmentManager.Instance.SourceDrive
    32. Dim targetDrive As String = EnvironmentManager.Instance.TargetDrive
    33. SaveSettings(filePath, sourceDrive, targetDrive)
    34. Catch ex As Exception
    35. ' Fehler protokollieren
    36. GlobalEventLogger.ExceptionToFile(String.Format(FailureGetMessage, NewCrlLf, ex.Message), ExceptionStatus.Failure)
    37. HandleErrorAndRestart()
    38. End Try
    39. End Sub
    40. Private Sub SaveSettings(filePath As String, sourceDrive As String, targetDrive As String)
    41. Try
    42. ' Ein neues XmlDocument-Objekt erstellen
    43. Dim xmlDoc As New XmlDocument()
    44. ' Das Wurzelelement für die Einstellungen erstellen
    45. Dim rootNode As XmlNode = xmlDoc.CreateElement("Application")
    46. xmlDoc.AppendChild(rootNode)
    47. ' Das Element für die Laufwerkeinstellungen erstellen
    48. Dim settingsNode As XmlNode = xmlDoc.CreateElement("DriveSettings")
    49. rootNode.AppendChild(settingsNode)
    50. ' Die Quelllaufwerk-Einstellung speichern
    51. Dim sourceNode As XmlNode = xmlDoc.CreateElement("SourceDrive")
    52. sourceNode.InnerText = sourceDrive
    53. settingsNode.AppendChild(sourceNode)
    54. ' Die Ziel-Laufwerk-Einstellung speichern
    55. Dim targetNode As XmlNode = xmlDoc.CreateElement("TargetDrive")
    56. targetNode.InnerText = targetDrive
    57. settingsNode.AppendChild(targetNode)
    58. ' Die XML-Datei speichern
    59. xmlDoc.Save(filePath)
    60. RaiseEvent SaveSuccesfull(Me, New EventClasses.SaveSuccesfullEventArgs(SaveMessage))
    61. ' Erfolgsmeldung protokollieren
    62. GlobalEventLogger.ExceptionToFile(String.Format(SuccessMessage, filePath), ExceptionStatus.Success)
    63. Catch ex As Exception
    64. ' Fehler protokollieren
    65. GlobalEventLogger.ExceptionToFile(String.Format(FailureSaveMessage, filePath, NewCrlLf, ex.Message), ExceptionStatus.Failure)
    66. End Try
    67. End Sub
    68. End Class



    @VB1963
    Genau da wollte ich das nicht haben, sondern zentral im Programmverzeichnis.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Genau da wollte ich das nicht haben, sondern zentral im Programmverzeichnis.


    Das ist aber gegen die Sicherheitsphilosophie von Microsoft. Ein Programm sollte keinerlei Schreibrechte auf den Ordner C:\Programme haben. (Auch wenn Du Dein Programm dort nicht hin speicherst.)
    Deshalb werden die Daten in andere Ordner des PC ausgelagert.
    C:\ProgrammData oder C:\users\USERNAME\AppData

    Wie kann ich das mal testen?​

    Die Programmierung kennt dafür den Ansatz Unit-Tests. vb-paradise.de/index.php/Threa…ight=unittest#post1181351
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    @INOPIAE

    OK habe dein Ratschlag bzgl der Verzeichnisse angenommen und das entsprechend geändert.
    Das Log zeigt, das alles so funktionierte wie ich es mir vorstellte.

    Den Rest werde ich mir dann mal ansehen. :thumbup:

    XML-Quellcode

    1. [ 08.05.2024 | 14:41:09 ] Hinweis
    2. EventLogfile für Mai 2024 erstellt.
    3. [ 08.05.2024 | 14:41:10 ] Hinweis
    4. Die Datei für die Programmeinstellungen war nicht vorhanden.
    5. Eine neue Datei wurde erstellt.
    6. [ 08.05.2024 | 14:41:16 ] Erfolgreich
    7. Die Basis-Konfiguration wurde erfolgreich in C:\Users\Amelie\DataBackUp\Settings.xml gespeichert.
    8. [ 08.05.2024 | 14:41:16 ] Erfolgreich
    9. Das Laden der Programm-Konfiguration aus der XML-Datei C:\Users\Amelie\DataBackUp\Settings.xml war erfolgreich.
    10. [ 08.05.2024 | 14:41:27 ] Erfolgreich
    11. Die Programm-Konfiguration wurden erfolgreich in C:\Users\Amelie\DataBackUp\Settings.xml gespeichert.
    12. [ 08.05.2024 | 14:41:27 ] Erfolgreich
    13. Das Laden der Programm-Konfiguration aus der XML-Datei C:\Users\Amelie\DataBackUp\Settings.xml war erfolgreich.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Weißt Du denn, welche Exceptions genau kommen?
    Du kannst auch Defaultwerte zurückgeben, wenn Exceptions gefangen wurden, also in GetEnvironmentData … Eh, Moment. Warum heißt denn die Methode GetEnvironmentData, wenn es eine Sub ist? Get… sollte meines Erachtens nur für Functions verwendet 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.
    @VaporiZed

    Es war ursprünglich mal eine Function die einen Boolean zurück gab. Habe das dann aber verworfen...

    ​Weißt Du denn, welche Exceptions genau kommen?

    Wo meinst du? In der GetEnvironmentData?
    Nein, weil ich noch nicht weiß wie ich da mal einen Fehler produzieren kann.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Kommen überhaupt Exceptions?
    Wenn nein: Wunderbar.
    Wenn la: Hast Du die ignoriert?
    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:

    Nein, weil ich noch nicht weiß wie ich da mal einen Fehler produzieren kann.
    Entweder du schreibst ein Throw New Exception an die Stelle die dich interessiert, dann könntest du aber genauso gut den Try-Block durch den Catch-Block ersetzen
    Oder du ziehst mal die Berechtigungen aus dem XmlFilePath,
    Oder wenn der XmlFilePath nach extern geht, könntest du ein Kabel ziehen.

    Aber bei Laden oder Speichern von ordentlichen Anwendungs-Settings sind Exceptions eher unwahrscheinlich bzw. sehr gut absehbar.

    Nun wo ichs geschrieben habe, fällt mir auf, dass das wenig Sinn macht. Das GetEnvironmentData ist das Laden von Settings?
    Und wenn da was schief geht, willst Default-Settings abspeichern? Das geht dann aller Wahrscheinlichkeit nach auch nicht.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Entweder du schreibst ein Throw New Exception an die Stelle die dich interessiert
    Wozu?
    Da wäre doch ein Haltepunkt effektiver:
    Debuggen, Fehler finden und beseitigen
    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!
    @RodFromGermany

    In der ​GetEnvironmentData bekomme ich erstmal KEINE Exception!

    Wie ich schon schrieb, funktioniert der Code vom:
    1.) erstellen der Standart Werte
    2.) laden der Standart Werte
    3.) speichern der neuen Werte

    Ich suchte nur eine Möglichkeit der Behandlung wenn in der Methode etwas schief läuft.

    VB.NET-Quellcode

    1. ' Umgebungsvariablen holen
    2. Public Sub GetEnvironmentData()
    3. Try
    4. ' Pfad zur XML-Datei aus der Umgebungsinformationen abrufen
    5. Dim filePath As String = EnvironmentManager.Instance.XmlFilepath
    6. ' Quell- und Ziel-Laufwerke aus der Umgebungsinformationen abrufen
    7. Dim sourceDrive As String = EnvironmentManager.Instance.SourceDrive
    8. Dim targetDrive As String = EnvironmentManager.Instance.TargetDrive
    9. SaveSettings(filePath, sourceDrive, targetDrive)
    10. Catch ex As Exception
    11. ' Fehler protokollieren
    12. GlobalEventLogger.ExceptionToFile(String.Format(FailureGetMessage, NewCrlLf, ex.Message), ExceptionStatus.Failure)
    13. HandleErrorAndRestart()
    14. End Try
    15. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Dann provoziere einen Fehler und reagiere darauf.
    So was gehört zum Testen eines Programms!
    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!