Jump to content
Melde dich an, um diesem Inhalt zu folgen  

beschriebene Datei leer nach Exception

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.

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
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

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Nimm an der Diskussion teil

Du kannst jetzt hier posten und Dich später registrieren. Wenn Du bereits über eine Konto verfügst, melde Dich jetzt an, um mit Deinem Konto zu posten.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

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

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

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

Melde dich an, um diesem Inhalt zu folgen  

Fachinformatiker.de, 2019 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

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

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung