Przechwytywanie wyjątku w konstruktorze, lista inicjalizacyjna

0

Czy jest możliwe przechwycenie wyjątku na etapie tworzenia obiektu bez przerywania pracy programu?

Korzystam z klasy, która odpowiada za ustanowienie połączenia z jakimś urządzeniem w przypadku jak to się nie powiedzie leci wyjątek, i ja chciałbym go przechwycić i pracować dalej ponieważ np. brak połączenia z jednym urządzeniem nie uniemożliwa pracy całego progamu.
Przykładowa klasa Wuu to właśnie klasa odpowiadająca za ustanawianie połączenia, zakładam, że nie mam do jej kodu dostępu, jestem tylko jej użytkownikiem.

class Wuu {
public:

    Wuu(int v) : port(setPort(v)) {
    };

    int setPort(int p) {
        if (p == 1111) {
            return p;
        } else {
            throw 0;
        }
    }

private:
    int port;

};

Klasa Foo, próbuje ustanowić połączenie, jeżeli się nie uda chciałbym przechwycić ten wyjątek w konstuktorze i pracować dalej.

class Foo {
public:

    Foo(int i)
    try : wuu(i) {
    } catch (...) {
        cout << "Exception Foo" << endl;
    }


private:
    Wuu wuu;
};

Tak samo w tej klasie chciałbym przechwycić wyjątek, który może wystapić w Foo

class Bar {
public:

    Bar(Foo &foo)
    try : foo(foo) {
    } catch (...) {
        cout << "Exception Bar" << endl;
    }

private:
    Foo foo;
};
int main(int argc, char** argv) {

    Foo foo(555);
    Bar bar(foo);

    return 0;
}
0

http://www.gotw.ca/gotw/066.htm

What's less obvious, but clearly stated in the standard, is that if the catch block does not throw (either rethrow the original exception, or throw something new), and control reaches the end of the catch block of a constructor or destructor, then the original exception is automatically rethrown.

If construction of any base or member subobject fails, the whole object's construction must fail.

What if your class can honestly have a sensible "construction partially failed" state -- i.e., it really does have some "optional" members that aren't strictly required and the object can limp along without them, possibly with reduced functionality? Then use the Pimpl idiom to hold the possibly-bad parts of the object at arm's length.

1 użytkowników online, w tym zalogowanych: 0, gości: 1