std::runtime_error wird nicht gefangen



  • okay, habe den Fehler weiter eingegrenzt

    std::string loadFile(const std::string& file_name) throw(std::runtime_error)
    {
        std::string buf, line;
        std::ifstream in(file_name.c_str(), std::ios_base::in);
        if(!in)
        {
            throw std::runtime_error(file_name);
        }
        return "";   // das funktioniert
    
        while(std::getline(in,line))
            buf += line;
        return buf;
    }
    

    Man beachte, das die Funktion in jedem Fall einen leeren String zurückgibt.

    Das Verhalten ist das erwartete: Für eine existente Datei gibt sie einen leeren String zurück, für eine nicht existente Datei kommt eine Exception, die auch gefangen wird.

    Entferne ich das

    return "";
    

    wird abort() aufgerufen im Falle einer nicht existenten Datei.



  • EDIT: ups... Falsche Vermutung



  • So geht's:

    std::string loadFile(const std::string& file_name) throw(std::runtime_error)
    {
        std::string buf, line;
        std::ifstream in(file_name.c_str(), std::ios_base::in);
        if(in.fail() || !in)
        {
            throw std::runtime_error(file_name);
            return "";
        } else {
            while(std::getline(in,line))
                buf += line;
            return buf;
        }
    }
    

    Kann mir vielleicht einer erklären, wo hier das Problem war?
    Ich hab nämlich keinen Schimmer, warum es jetzt geht.

    Philipp



  • Was ist denn mit dem Forum los? Jeder schreibt hier "mach mal catch(...)" aber das kann doch nicht funktionieren wenn die Funktion spezifiziert hat, was sie werfen darf..

    std::string loadFile(const std::string& file_name) throw(std::runtime_error)
    

    Da spezifizierst du, dass du nur runtime_error werfen darfst. Wenn eine andere Exception kommt, wird terminiert. Da bringt dir dein catch(...) auch nix mehr. Mach das mal weg und guck DANN mit catch(...) was eigentlich geworfen wird.



  • NewSoftzzz schrieb:

    Was ist denn mit dem Forum los? Jeder schreibt hier "mach mal catch(...)" aber das kann doch nicht funktionieren wenn die Funktion spezifiziert hat, was sie werfen darf..

    std::string loadFile(const std::string& file_name) throw(std::runtime_error)
    

    Da spezifizierst du, dass du nur runtime_error werfen darfst. Wenn eine andere Exception kommt, wird terminiert. Da bringt dir dein catch(...) auch nix mehr. Mach das mal weg und guck DANN mit catch(...) was eigentlich geworfen wird.

    Bekenne mich schuldig.
    Ich verwende nie throw und war der Meinung, dass sonst eine std::bad_exception
    zurückkommt. Die ist allerdings (scheinbar) nur der Fall, wenn throw diese
    auch enthält.



  • tja schrieb:

    Exception-Spezifikationen sind deprecated, weg damit! 🤡

    Der Beitrag ging verloren.



  • tja schrieb:

    Exception-Spezifikationen sind deprecated, weg damit! 🤡

    Stimmt, er hat im Prinzip das gleiche gesagt wie ich. Aber wenn man wie ein Troll schreibt wird man halt nicht ernst genommen 😞

    mfg, René~



  • NewSoftzzz schrieb:

    tja schrieb:

    Exception-Spezifikationen sind deprecated, weg damit! 🤡

    Stimmt, er hat im Prinzip das gleiche gesagt wie ich. Aber wenn man wie ein Troll schreibt wird man halt nicht ernst genommen 😞

    mfg, René~

    Du meinst also, wenn man ein Clown-Smiley benutzt, dass man damit kennzeichnet ein Troll zu sein?
    Dann sollte Marcus++ das Smiley löschen!
    🤡

    XSpille schrieb:

    Danke für die Info, allerdings ist mir das klar...

    Ist klar...



  • Wer in C++ Exception-Spezifikationen verwendet, ist selbst schuld. Es hat schon seinen Grund, wieso sie in C++0x deprecated sind.

    Siehe auch http://www.gotw.ca/publications/mill22.htm



  • Nexus schrieb:

    Wer in C++ Exception-Spezifikationen verwendet, ist selbst schuld. Es hat schon seinen Grund, wieso sie in C++0x deprecated sind.

    Ach, die sind wirklich deprecated. Das wusste ich nicht 🤡

    mfg, René~



  • Vielleicht mal Vorurteile gegenüber Unregistrierten abbauen... 😉



  • Danke für den Hinweis auf Sutter. Sehr erhellend! 🙂


Anmelden zum Antworten