Exceptions in Initialization lists



  • Gibt es eine Moeglichkeit in Initialization lists exceptions zu werfen?

    Ohne Init lists:

    MyClass::MyClass(int x, int y) throw(std::out_of_range)
    {
        if(x>=7 || x<=-1)
            throw std::out_of_range("x is out of range!");
        else if(y>=7 || y=-1)
            throw std::out_of_range("y is out of range!");
        else
        {
            x_=x;
            y_=y;
        }
    }
    

    Kann man das auch mit Initialization lists machen?



  • MyClass::MyClass(int x)
      : x(x <= foo ? x : throw bar())
    { }
    

    oder sowas könnte gehen, aber ich seh nicht ganz den Sinn 🙂



  • Sieht interessant aus.
    Was du an dem Sinn nicht verstehst, versteh ich dafuer nicht so ganz... 🙂



  • Bashar schrieb:

    MyClass::MyClass(int x)
      : x(x <= foo ? x : throw bar())
    { }
    

    müssen bei :? die beiden ausdrücke nicht vom gleichem typ sein?
    und was ist denn x( throw bar() )?!
    glaube nicht das es so geht.



  • Doch es klappt und zwar deswegen: Wenn der zweiter Fall eintritt wird sofort aus der Funktion hinausgesprungen wird und die Zuweisung des nicht vorhandenen return values wird nie stattfinden

    #include <iostream>
    #include <stdexcept>
    using namespace std;
    
    class MyClass
    {
    public:
            MyClass::MyClass(int x);
    
    private:
            int x_;
    };
    
    MyClass::MyClass(int x)
      : x_(x <= 42 ? x : throw std::out_of_range("bla"))
    { }
    
    int main()
    {
            try
            {
                    MyClass m(43);
            }
    
            catch(...)
            {
                    std::cout << "klappt" << std::endl;
            }
    
    return 0;
    }
    

    Ist aber n zieeemlich schmutziger hack 😃



  • #include <iostream>
    #include <ctime>
    using namespace std;
    
    void func( ){}
    
    int main( )
    {   
        int x = rand() > rand() ? 1 : func();
    }
    

    compile-error schrieb:

    In function int main()': \func()()' has type `void' and is not a throw-expression

    kann ich die fehlermeldung so deuten, das bei :? bei beiden ausdrücken der typ gleich sein muss, es sei denn in einem der ausdrücke wird eine exception geschmissen? 😮
    man lernt nie aus. das ist ja bei settern sogar ganz praktisch 😋



  • borg schrieb:

    kann ich die fehlermeldung so deuten, das bei :? bei beiden ausdrücken der typ gleich sein muss, es sei denn in einem der ausdrücke wird eine exception geschmissen? 😮

    Genau.


Anmelden zum Antworten