Zum Inhalt springen

beschriebene Datei leer nach Exception


Tician

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von KeeperOfCoffee
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...