Frage zu Try Catch



  • Hallo

    Ich möchte einen Winsocket öffnen und die Daten von diesem Winsocket empfangen und abspeichern. Das klappt ja auch alles. Nun möchte ich aber Try Catch zum Fehlerabfangen verwenden. Wenn der Client ausfällt soll erstmal eine Fehlermeldung erscheinen. Da ich den Client nicht abschalten kann, habe ich derzeit keine Möglichkeit für so einen Test. Würde mein Code funktionieren? Wozu wird in die Klammern nach Catch ein int, void oder ähnliches benötigt? Es scheint keine Rolle zu spielen, was ich da reinschreibe.

    try
        {
            AfxSocketInit(NULL);
            CSocket sockClient;
            sockClient.Create();
    
            sockClient.Connect(strPCNumber.c_str(), PORT); 
    
            char fe1[1000];
            int a = sockClient.Receive(fe1, 999);
            string str1;
    
            for (int i=0; i<10; i++)
            {
                sockClient.Receive(fe1, 999);
                str1 = fe1;
                cout << str1.c_str() << endl;
    
            }
            sockClient.Close();
        }
    
        catch(int)
        {
            cout << "Fehler" << endl;
        }
    


  • #include <iostream>
    #include <string>
    using namespace std;
    
    class excep_base
    {
    public:
        excep_base(const string & msg)
            :    msg_( msg )
        {
        }
    
        const string & what() const
        {
            return msg_;
        }
    
    private:
        string msg_;
    };
    
    class mega_fehler : public excep_base
    {
    public:
        mega_fehler(const string & msg)
            excep_base( msg )
        {
        }
    };
    
    class irgend_ein_fehler : public excep_base
    {
    public:
        irgend_ein_fehler(const string & msg)
            excep_base( msg )
        {
        }
    };
    
    int main()
    { 
        try
        {
           //...
           if(/* großer fehler */)
               throw mega_fehler( "blablabla Fehler" );
           //...
           if(/* irgend ein anderer fehler */)
               throw irgend_ein_fehler( "blabla" );
        }
        catch(const mega_fehler & m)
        {
            cout << "mega fehler mit der msg: " << m.what() << endl;
        }
        catch(const irgend_ein_fehler & i)
        {
            cout << "irgend ein fehler mit der msg: " i.what() << endl;
        }
        return 0;
    }
    


  • jetzt ist die frage welche der funktionen in try block throwt den?(bei dir)

    [ Dieser Beitrag wurde am 17.03.2003 um 13:23 Uhr von Dimah editiert. ]



  • Hallo,
    dein try-catch ist hier völlig sinnlos. Keine der Anweisungen im try-Block wird jemals eine Exception vom Typ int werfen. Aus diesem Grund wird auch niemals der catch-Block ausgeführt.

    Wozu wird in die Klammern nach Catch ein int, void oder ähnliches benötigt?

    Der Typ den man in Klammern nach einem catch angibt ist der der Exception den man in dem entsprechenden catch-Handler behandeln möchte.



  • Um den Teil geht es. Bei Abbruch der Verbindung kann ja nichts mehr empfangen werden.

    for (int i=0; i<10; i++)
            {
                sockClient.Receive(fe1, 999);
                str1 = fe1;
                cout << str1.c_str() << endl;
    
            }
    

    In der Hilfe gibt es ja die SocketException. Dazu habe ich mir mal Try Catch bei Datenbankabfragen angesehen. Aber so funktioniert das nun wieder nicht. Wieso ist das immer anders und nicht nach einem Muster?

    try
        {
            dbnumber.OpenEx(sODBCName, CDatabase::noOdbcDialog);
            if(dbnumber.IsOpen())
            {
                number.Open(CRecordset::snapshot, strSQL.c_str());
    
                strReturn += number.m_Value1;
            }
        }
        catch(CDBException* pEx)
        {
            string str1 = pEx->m_strError;
            cout << str1.c_str() << endl;
        }
    


  • Das ist eigentlich immer nach dem selben Muster.

    try { blablub }
    catch(Exception& e) { fehler.. }

    Es gibt aber eben verschiedene Exceptions, damit man besser filtern kann (guck dir nochmal Dimahs Beispiel an).

    Du musst in der Hilfe zu deiner Socketlib gucken welche Exception geworfen wird
    Und wenn da zB. SocketException steht, dann mach doch mal

    try {
    // deinen socket-kram
    } catch(SocketException& e) {
    // fehlerbehandlung
    }



  • *wie bescheuert alte Threads hochhol* 😃



  • was haltet ihr von

    try
    {
      //dein funktion die ne exception schmeißt
    }
    catch(...)
    {
        cout << "irgendeine exception wurde ausgeworfen" << endl;
    }
    

    hier laufen, denke ich alle rein...



  • @pinorrix: Ich glaube du bist etwas zu spät... 😃



  • ja ein wenig spät 🙂 ist wohl zeit guten nacht zu sagen und das lesen zu beenden..... also gute nacht!


Anmelden zum Antworten