Objekte innerhalb try-catch



  • Hallo,

    Bin gerade dabei mich in C# einzuarbeiten und habe ne grundlegende Frage zu try-catch-Blöcken und darin befindlichen Objekten:

    Configuration c;
    
    try
    {
        c = new Configuration("a.txt");
    } catch(CFIOLoadingFailedEx e)
    {
        Console.WriteLine("Datei existiert noch nicht! " + e.StackTrace);
    }
    
    Console.WriteLine(c.GetValue("Width")); // Compiler: Verwendung der nicht zugewiesenen lokalen Variablen "c"
    

    Eigentlich ist klar, dass der Compiler meckert, weil ich c noch nichts zugewiesen habe. Packe ich die Deklaration von c in den try-Block ist sie nach dem try-catch-statement natürlich auch unbekannt. Aber wie mach ich es dann? Ich will die Exception fangen, aber danach mit dem Objekt c weiterarbeiten.



  • So gehts...

    Configuration c = null;
    
    try
    {
        c = new Configuration("a.txt");
        Console.WriteLine(c.GetValue("Width"));
    } catch(CFIOLoadingFailedEx e)
    {
        Console.WriteLine("Datei existiert noch nicht! " + e.StackTrace);
    }
    


  • Super, manchmal ist die Lösung so einfach ... 🙄

    Danke.



  • Und nochmal ein ähnliches Problem

    private void WriteConfigFile()
    {
        StreamWriter myFile = null;
        try
        {
        myFile = new StreamWriter(this.pathAndFilename + "??");
        myFile.WriteLine(ConfigFileIO.disclaimer);
        ICollection<string> keys = values.Keys;
        foreach(string s in keys)
        {
            myFile.WriteLine(s + "=" + values[s]);
        }
        } catch(Exception e)
        {
            throw new CFIOSavingFailedEx("Cannot save config file", e);
        } finally {
            myFile.Close(); // System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
        }
    }
    

    Im Exception Fall, kommt bei myFile.Close() ein Fehler. Aber wieso? Laut Doku soll doch der Code in finally{} sowohl im Erfolgsfall, als auch im Fehlerfall ausgeführt werden!?


  • Administrator

    DarthZiu schrieb:

    Im Exception Fall, kommt bei myFile.Close() ein Fehler. Aber wieso? Laut Doku soll doch der Code in finally{} sowohl im Erfolgsfall, als auch im Fehlerfall ausgeführt werden!?

    Tut es doch auch. Wenn aber der Konstruktor fehlschlägt, wir der Variable auch nie eine Referenz auf das Objekt zugewiesen. Entweder fragst du halt zuerst mit if ab, ob es null ist oder nicht, oder wenn es geht, verwendest du das using Statement.

    Grüssli


Anmelden zum Antworten