throw im konsruktor
-
wie oben schon beschrieben, habe ich ein problem mit dem throw. es steht im konstruktor und ist eben nur da sinnvoll. um eine exception abzufangen müsste ich ein objekt der klasse ja im try block deklarieren, kann dann aber nachher nicht mehr darauf zugreifen. gibt es eine einfache möglichkeit sowohl den throw-ausdruck im konstruktor stehen zu lassen und gleichzeitig aber das objekt so zu deklarieren dass man die exception abfangen kann(ohne es als statisch oder so zu deklarieren)?
-
wenn du im konstruktor die exception wirfst, hat die konstruktion nicht funktioniert.
du willst doch kein totes objekt fleddern?
-
jimmy3 schrieb:
...müsste ich ein objekt der klasse ja im try block deklarieren, kann dann aber nachher nicht mehr darauf zugreifen....
Rrrrrischtisch !!!
Konnte das Objekt nicht erzeugt werden, sollte man auch nicht drauf zugreifen ...
Ich sehe 2 Möglichkeiten: Entweder fasst Du den try-Block weiter, so dass er auch die nachfolgende Funktionalität (die dann das Objekt nutzt) umfasst, oder Du nutzt Pointer:MyClass *c = 0; try { c = new MyClass(1); } catch(unable_to_construct_MyClass_exception& e) { c = new MyClass(2); // vielleicht klappt's ja mit der 2 // Falls nicht klappt, Fliegt halt wieder eine exception und dann geht's eben "raus hier" } c->useMyClass(); ... // irgendwo später delete c;Das lohnt sich aber nur, wenn man wirklich so einen Retry (der auch eine Menge Aufregung verursachen kann) braucht.
Insgesamt würde ich eher Ersteres machen:
try { MyClass c(1); c.useMyClass(); } catch(unable_to_construct_MyClass_exception& e) { // Hier hat's eben nicht geklappt, aber es wurde eben auch nichts gemacht mit dem "ungültigen Objekt" }Gruß,
Simon2.
-
volkard schrieb:
wenn du im konstruktor die exception wirfst, hat die konstruktion nicht funktioniert.
der konstruktor benötigt mehrere parameter, da er wiederum eine winsock funktion aufruft die eben diese verwendet. da der konstruktor ja keinen rückgabewert hat sollte ein runtime_error signalisieren, dass die funktion fehlgeschlagen ist.
volkard schrieb:
du willst doch kein totes objekt fleddern?
kann ich dir nur sagen wenn du mir sagst was du mit dem fleddern meinst

-
Simon2 schrieb:
Rrrrrischtisch !!!
Konnte das Objekt nicht erzeugt werden, sollte man auch nicht drauf zugreifen ...
mit den parametern die ich übergebe kann das objekt immer erzeugt werden, allerdings verliert es ja dann ausserhalb des try blocks seine gültigkeit auch wenn es innerhalb ohne probleme erzeugt werden konnte.
zu 1: das objekt enthält infos die im hintergrund stehn und auf die ab und zu zugegriffen wird, diese möglichkeit fällt also weg es sei denn der komplette code steht im try block.
zu 2: retry brauche ich auch nicht aber das mit dem dynamischen allokieren ist hier wohl die einzige lösung.
danke euch soweit mal

-
Zeig mal deinen genauen Code, ich rieche einen Designfehler

MfG SideWinder
-
jimmy3 schrieb:
volkard schrieb:
wenn du im konstruktor die exception wirfst, hat die konstruktion nicht funktioniert.
der konstruktor benötigt mehrere parameter, da er wiederum eine winsock funktion aufruft die eben diese verwendet. da der konstruktor ja keinen rückgabewert hat sollte ein runtime_error signalisieren, dass die funktion fehlgeschlagen ist.
eben nicht.
ich nehme mal an, die klasse heißt Socket.
und dem ctor übergibst du hostname und port. der ctor muss alles machen, von der namensauflösung bis zum connecten. wenn nur eines davon nicht klappt, wirfst du eine exception. und das konstruieren des sockets hat nicht funktioniert.
soweit ist doch alles in butter.try{ Socket s("ftp.volkard.de",21); //hier lande ich nur, wenn der ctor keine exception warf s.send("cd /www"); ... }catch(MyException& e){ if(e.m_error==1) cout<<"konnte namen nicht auflösen\n"; else if(e.m_error==2) cout<<"konnte nicht connecten\n"; else cout<<"bitte rufen sie ihren administrator\n"; }ist doch alles in butter.
-
also ich hab den code nochmal etwas abgeändert und nun ist es schon möglich das objekt im try block zu erzeugen, da es später weniger oft benötigt wird als ich dachte.
volkard schrieb:
ich nehme mal an, die klasse heißt Socket.
Nein, so eine wird zwar auch verwendet aber es handelt sich bei mir um eine klasse zum verwalten von hostinformationen.
Euch allen aber nochmal Vielen Dank!
