Exceptions :(



  • Hi,

    ich kapier das mit den Exceptions noch net so ganz... Hier mein code:

    class CException
    {
    public:
        CException(const char *LogType, const char *LogText, const char *FileName, unsigned int Line)
        {
            strcpy (this->m_LogType, LogType);
            strcpy (this->m_LogText, LogText);
            strcpy (this->m_FileName, FileName);
            this->m_Line = Line;
        }
    
        // weitere Funktionen folgen
    
    protected:
        char   *m_LogType;
        char   *m_LogText;
        char   *m_FileName;
        int     m_Line;
    
    };
    
    void test(void)
    {
        throw CException (Error, "Fehler in der Test", __FILE__, __LINE__);
    }
    
    int main (void)
    {
        try
        {
            test ();
        }
        catch (CException &Error)
        {
            cout << "catch ist in CException" << endl;
            // Error.WriteErrorToLog ();
            return 0;
        }
        catch (...)
        {
            cout << "catch ist in \"...\"" << endl;
            return 0;
        }
    
        return 0;
    }
    

    Wieso rutscht der in catch (...) rein und nicht in catch (CException &Error)??? 😕 Ich verzweifle daran bald.... 😞 😞



  • char *m_LogType;
    char *m_LogText;
    char *m_FileName;

    gib den sachen ein bisschen speicher.



  • warum der das genau macht, kann ich dir auch nicht sagen, du erzeugst aber beim erzeugen von CException undefinded behaviour, da du keinen Speicher für deine Pointer reservierst und außerdem musst du das this-> nicht machen (Member Variablen erkennst du ja auch am m_ Präfix) und C sollte man nicht vor Klassennamen benutzen



  • CException(char *LogType, char *LogText, char *FileName, unsigned int Line)
        {
            m_LogType = LogType;
            m_LogText = LogText;
            m_FileName = FileName;
            m_Line = Line;
        }
    


  • Funzt alles net 😞



  • Original erstellt von <Rakshasa>:
    Funzt alles net 😞

    Geht's auch in deutsch? 😉

    Was ist denn Error in der Zeile mit der throw-Anweisung?



  • Das ist Error:

    const char* Error ="<font color=\"#FF0000\">Error!</font>"
    


  • Hallo Leute.

    Ich habe den Code mal etwas bearbeitet, rahaskwa (wie auch immer) gab ihn mir auch.
    Interessant ist folgendes:

    #include <iostream>
    
    using namespace std;
    
    class CException
    {
    public:
        CException(const char *LogType, const char *LogText, const char *FileName, unsigned int Line)
        {
            m_LogType = new char[strlen(m_LogType)];
            m_LogText = new char[strlen(m_LogText)];
            m_FileName = new char[strlen(m_FileName)];
    
            strcpy(m_LogType, LogType);
            strcpy(m_LogText, LogText);
            strcpy(m_FileName, FileName);
            this->m_Line = Line;
        }
    
        // weitere Funktionen folgen
    
        char   *m_LogType;
        char   *m_LogText;
        char   *m_FileName;
        int     m_Line;
    
    };
    
    void test(void)
    {
        throw CException(Error, "Fehler in der Test", __FILE__, __LINE__);
    }
    
    int main (void)
    {
        try
        {
            test ();
        }
    
        catch (CException Exception)
        {
            cout << "catch ist in CException" << endl;
            return 0;
        }
        catch (...)
        {
            cout << "catch ist in \"...\"" << endl;
            return 0;
        }
    
        return 0;
    }
    

    wirft eine Exception nach (...).
    ,
    aber:

    #include <iostream>
    
    using namespace std;
    
    class CException
    {
    public:
        CException(const char *LogType, const char *LogText, const char *FileName, unsigned int Line)
        {/*
            m_LogType = new char[strlen(m_LogType)];
            m_LogText = new char[strlen(m_LogText)];
            m_FileName = new char[strlen(m_FileName)];
    
            strcpy(m_LogType, LogType);
            strcpy(m_LogText, LogText);
            strcpy(m_FileName, FileName);*/
            this->m_Line = Line;
        }
    
        // weitere Funktionen folgen
    
        char   *m_LogType;
        char   *m_LogText;
        char   *m_FileName;
        int     m_Line;
    
    };
    
    void test(void)
    {
        throw CException(Error, "Fehler in der Test", __FILE__, __LINE__);
    }
    
    int main (void)
    {
        try
        {
            test ();
        }
    
        catch (CException Exception)
        {
            cout << "catch ist in CException" << endl;
            return 0;
        }
        catch (...)
        {
            cout << "catch ist in \"...\"" << endl;
            return 0;
        }
    
        return 0;
    }
    

    wirft eine Exception nach CException!

    VIlleicht hilft das etwas weiter.

    MfG MAV



  • Original erstellt von <fisch>:
    **```cpp
    CException(char *LogType, char *LogText, char *FileName, unsigned int Line)
    {
    m_LogType = LogType;
    m_LogText = LogText;
    m_FileName = FileName;
    m_Line = Line;
    }

    blubb, schlechte imitation von fisch 🙄



  • Ups, stimmt...
    Das sollte auch für die anderen vars gelten...

    [ Dieser Beitrag wurde am 06.04.2003 um 20:09 Uhr von Mis2com editiert. ]



  • @Mis2com
    Vielleicht solltest du nicht strlen mit uninitialisierten char-Zeigern aufrufen. 😉



  • warum Noesis? ist der code falsch?



  • Wüsste ich auch gerne...



  • nö, ist korrekt. Wobei const char* besser wäre.



  • afair müssten das const char * zeiger sein, ich glaube mich erinnern zu können irgendwo mal gelesen zu haben, das c-strings, egal wo definiert, im ganzen programm gültig sind, sprich

    const char *f () {
       return "Hallo";
    }
    

    ist afair erlaubt.
    aber auf jedenfall zum string kopieren niemals den = operator verwenden, sondern schön brav zuerst mit

    char *str = new char[strlen(other_str)+1];
    

    speicher allokieren, dann

    strcpy (str, other_str);
    

    den string kopieren
    und am ende mit

    delete [] str;
    

    den speicher wieder frei geben.
    oder std::string verwenden 😃



  • aber dann müsste man noch mehr ändern. weil const char* auf char* geht nicht.



  • Original erstellt von <the fisch fake>:
    aber dann müsste man noch mehr ändern. weil const char auf char geht nicht.**

    Ja, dann müssten natürlich die member auch const char* sein und über die Initialisierungsliste des Konstruktors gesetzt werden.

    [ Dieser Beitrag wurde am 06.04.2003 um 20:22 Uhr von DrGreenthumb editiert. ]


Anmelden zum Antworten