Tician Geschrieben 20. November 2018 Teilen Geschrieben 20. November 2018 Moin, ich hab ein Consolen-Programm, das 2 mal am Tag automatisiert läuft und Daten verarbeitet. Jetzt ist das Programm in letzter Zeit recht häufig gegen die Wand gefahren (vom StreamWriter-Block in de Catch-Block) und ich hab festgestellt das Daten fehlen und bin gerade am Rätseln warum, meine Vermutung ist, dass meine Datei (oder deren INhalt) verschwinden wenn eine Exception geworfen wird. Hier mal die vereinfachte Form (unwichtiges ausgelassen): static void Main(string[] args) { try { string[] files = Directory.GetFiles(stringSource, stringFile); if (files.Length != 0) { using (StreamWriter sw = new StreamWriter("Track_901-903_" + date + ".csv")) { foreach (object datei in files) { //Zeugs using (StreamReader oReader = new StreamReader(name, Encoding.GetEncoding("ISO-8859-1"))) { doc.Load(oReader); XmlElement root = doc.DocumentElement; foreach (XmlNode node2 in list2) { if (node2["id"] != null) { sendid = node2["id"].InnerText; } } //Schreib irgendwas in dei Datei... } if (sendid == "") { File.Move(name, stringSource + "\\Clearing\\" + Path.GetFileNameWithoutExtension(name) + ".xml"); //Hier Beispiel, Exception weil Datei schon existiert!! } } } File.Move("Track_901-903_" + date + ".csv", destinationPath); } } catch(Exception ex) { using (StreamWriter writer = new StreamWriter("Programm-Name.log", true)) { writer.WriteLine(DateTime.Now.ToString() + " " + ex.Message); } } } Rein theoretisch (nach meiner Logik) müsste bei einer Exception im ausführenden Programm-Ordner (da wo die .exe liegt) eine Datei liegen, da ich keinen anderen Pfad angegeben habe. Ich bin schon in viele Exceptions gerannt (die oben habe ich schon vorzeitig abgefangen, dient mir aber hier als gutes Beispiel), aber ich habe dort noch nie eine Datei gefunden - verschoben sollte sie nur werden wenn der StreamWriter-Part komplett durchgelaufen ist. Hat jemand eine Idee was da schief läuft? Ich kann keine Informationen dazu finden was eigentlich genau passiert wenn das Programm den "using (StreamWriter...) {...}" Part wegen einer Exception verlässt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rabber Geschrieben 20. November 2018 Teilen Geschrieben 20. November 2018 Ich würde das Ganze erst einmal aufsplitten und dann ordentlich Debuggen. Sprich, die verschiedenen Teile in separate Funktionen packen (jeder Schleifendurchlauf eine, Read von Write getrennt, usw.) und zu jede Methode mit einem Debug.WriteLine zu Beginn und einem try/catch Block versehen. Warum? Weil Du dann erst siehst, was wann und wo überhaupt schief geht. So, wie es aktuell bei Dir ist, passiert viel zu viel Magic in zu wenig Raum und es ist kaum herauszufinden, warum. ERst recht nicht ohne konkrete Exception. JimTheLion reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
KeeperOfCoffee Geschrieben 20. November 2018 Teilen Geschrieben 20. November 2018 (bearbeitet) vor 2 Stunden schrieb Errraddicator: Ich würde das Ganze erst einmal aufsplitten und dann ordentlich Debuggen. Code strukturieren und debuggen ist gut und schön, wird aber hier leider nicht helfen bzgl. warum der Code in ihrer Exception nicht funktioniert. Ich persönlich nutze log4net, aber ihr Code (der Streamwriter in der Exception) sollte ohne Probleme funktionieren. Nach Ticians aussage ist auch keine Datei in dem Ordner vorhanden. Ich würde deswegen davon ausgehen, dass es Probleme bzgl. mit den Schreibrechten gibt. Ist ein Virenscanner vorhanden, der irgendwie dazwischen funkt? Bearbeitet 20. November 2018 von KeeperOfCoffee Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 20. November 2018 Teilen Geschrieben 20. November 2018 Man kann sich ja angucken, was ein StreamWriter macht, wenn er auf eine Exception läuft. Da ein "using" im Grunde ein try { ... } finally { x.Dispose(); } ist, muss man nur in die Dispose-Methode des StreamWriters gucken. Da sieht man dann, dass er noch ein Flush ausführt - was an sich dazu führen müsste, dass sämtlicher Text, der bis zur Exception in den Writer reingegeben wurde, auch in der Datei landet (s. https://referencesource.microsoft.com/#mscorlib/system/io/streamwriter.cs,f11dc172664bb49c). Wenn bei dir nicht einmal die Datei existiert, deutet das auf andere Probleme hin. Denn die Datei wird vom StreamWriter meines Wissens nach direkt erzeugt. Nicht jeder Text, den du per Write(...) reingibst, landet sofort in der Datei, aber die Datei selber sollte schon zu Beginn existieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 20. November 2018 Teilen Geschrieben 20. November 2018 vor 9 Stunden schrieb Tician: Hat jemand eine Idee was da schief läuft? Ich kann keine Informationen dazu finden was eigentlich genau passiert wenn das Programm den "using (StreamWriter...) {...}" Part wegen einer Exception verlässt. Probiere es doch aus. Schmeiß doch selber einfach eine Exception. Ich würde das Programm an deiner Stelle auch umschreiben, denn es ist zu fehleranfällig. Separiere die Aufgaben und mache nicht alles auf einmal. Die foreach-Schleife sammelt doch die Daten, also packe die Daten in eine geeignete Datenstruktur und wenn er damit durch ist, schreibe dann die werte in die Datei. Das macht den Code verständlicher und leserlicher und du wirst den Fehler schneller lokalisieren können. Auch solche Konstrukte, wie public void Foo(Bar bar) { if(bar != null) { // Tu etwas } } Würde ich vermeiden, weil es eine unnötige Verschachtelung ist. Besser wäre public void Foo(Bar bar) { if(bar == null) return; // Tu etwas } So liegt die if-Abfrage und die eigentliche Aufgabe auf der selben Verschachtelungsebene und der Code wird übersichtlicher. Mir wird aber auch nicht so ganz klar, was genau das Programm eigentlich tun soll, weil einfach zu viel auf einmal passiert. Es fehlt offenbar auch Code, um überhaupt zu erkennen, was du da gebaut hast. Wofür genau ist der StreamWriter da? Was soll er denn schreiben? Wieso werden die Dateien noch verschoben? Exceptions sollen auch nur Ausnahmen bzw. Fehler behandeln. Das befreit dich aber nicht davon, dass du dein Programm nicht gegen Fehlerfälle absichern musst. Anstatt also auf die Exception zu reagieren, ob die Datei vorhanden ist, solltest du im Vorwege dies selbst überprüfen und darauf reagieren. Dann brauchst du auch kein Try-Catch-Block. Den StreamReader brauchst du eigentlich auch nicht, da man über XDocument.Load() schon die XML-Datei einlesen kann. äymm und Rabber reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.