throw



  • Hallo,

    ich muss für die Schule einen Vortrag über try, catch und throw halten, habe aber keine Ahnung wie das throw eigentlich funktioniert oder wann es benutzt werden sollte.

    Wie try und catch geht weiß ich aber mit dem throw komme ich nicht so richtig klar.
    Ich würde mich auch über ein, zwei sinnvolle Anwendungsbeispiele freuen, denn so wie ich das bisher verstanden habe ist throw sehr sinnlos da man es doch einfacher mit anderen Sachen machen kann.

    Danke



  • Ein Beispiel

    class parser_error
        :   public std::logic_error
        {
        public:
            explicit parser_error( const std::string& error )
            :   logic_error( error )
            {}
        };
    
    //..
    void Parser::parse_totals_formula( const std::string& str, bool summarized )
    throw( parser_error )
    // Spezifikation, ob was geworfen wird, steht in der Schnittstelle damit Benutzer der Klasse wissen
    // "Oh, hier muss ich ein try-Block mit dem entsprechenden catch() drum machen.
    {
    //...
        if( !info.full )
        {
            std::stringstream error;
            error << "Parser error at: " << info.stop << std::endl;
            throw( parser_error( error.str() ) );     // Hier wird geworfen
        }
    //...
    }
    


  • Danke für das Beispiel, aber so ganz klar ist mir immer noch nicht wie throw jetzt eigentlich funktioniert



  • Im Magazin (unten im Forum) gibt es einen Artikel über Exception Handling in C++. Sollte dir bestimmt weiterhelfen



  • throw "wirft" das, was irgendwo (hoffentlich) in einem catch-block "gefangen" wird, sonst wird das program mit einem "unhandled exception" beendet
    also da, wo man einen fehler feststellt, kann man throw dazu benutzen, es mitzuteilen



  • // Kommentar schrieb:

    Danke für das Beispiel, aber so ganz klar ist mir immer noch nicht wie throw jetzt eigentlich funktioniert

    Das dachte ich mir schon. Nehmen wir den Klassiker.

    float divide(float divident, float divisor) {
        if (divisor == 0.0f) {
            throw divide_by_zero_exception();
        } else {
            return divident / divisor;
        }
    }
    
    int main() {
        float qoutient = 0.0f;
        try {
            quotient = divide(4.0f, 0.0f);
            cout << "Ergebniss: " << qoutient << endl;
            return 0;
        } catch (divide_by_zero e) {
            cout << "Fehler! Division durch Null" << endl;
            return 1;
        }
    }
    

    Erklaerung: Die Funktion divide() wirft, wenn der Divisor = 0 ist, mit "throw" eine Ausnahme die "divide_by_zero" heisst. Der Aufrufer, in diesem Fall die Funktion "main", versucht (mit try) durch Null zu dividieren. Da "divide" es nicht kann, wirft es eine Ausnahme. "main" wiederrum faengt (mit catch) diese Ausnahme und reagiert darauf (der Block nach catch). Wenn der Divisor nicht 0 ist, dann wird keine Ausnahme geworfen, sodass der catch-Block niemals betreten und der try-Block vollstaendig ausgefuehrt wird (es wird also das Ergebnis angezeigt und das Programm beendet).

    Ich hoffe meine Erklaerung hilft ein wenig weiter.



  • Der Klassiker der "falschen Funktionen" oder wie? *autsch* *autsch* *autsch* *autsch* *autsch*.

    divide(FLT_MAX, FLT_MIN); // big badaboom
    

    Machs mit nem Integer, und ich bin's zufrieden.
    Bzw. erklär nicht einem Anfänger was mit einem Beispiel wo du nen float mit == vergleichst 😉


Log in to reply