Rekursionsfkt verlassen
-
Hallo,
ne blöde Frage. Gibts ne Möglichkeit ne Rekursionsfunktion, egal wie oft sie sich schon aufgerufen hat, auf einmal komplett zu verlassen ?
Ich hab das Problem das ich eine Fkt habe die mit Dateien etwas baut. Dabei ruft sie sich immer wieder selbst auf. Am Ende geht Sie dann wieder rückwärts allerdings sind die Dateien dann unter Umständen nicht mehr gültig und das Ding schmiert ab. Jetzt bräuchte ich ne Try Catch die das abfängt, oder eben ein Befehl die die ganze Rekursion verlässt und die Objekte einfach killt !Gibt es sowas ?
Danke
Gruß Euro.
-
Am besten setzt du den äußersten Aufruf der Funktion (in deinem Hauptprogramm) in einen try-catch-Block, dann kannst du mittels throw ganz schnell aus der Funktion rausgehen:
myfunc() { // viel Code if(error) throw my_exception; // weiterer Code myfunc(); // noch mehr Code } //... try { myfunc(); }catch(my_exception& e){ cout<<"Rekurion abgebrochen"; }
-
Hallo,
danke für die Antwort. Wie muss ich den error deklarieren ?
Das kennt er bei mir nicht !?Danke
Gruß Euro.
-
Dort setzt du deine Bedingung ein, wann du aus der Rekursion rausgeworfen werden willst.
(ehe du fragst: my_exception kann prinzipiell eine leere Klasse sein - aber du kannst auch Member, Konstruktor und Abfragemethoden einbauen, wenn du nach "unten" durchgeben willst, warum du abgestürzt bist)
-
Hallo,
jo das mit der Klasse war so weit klar, mein Problem ist nur ich kenn den Fehler nicht. Das Ding steigt aus weil es z.B. auf eine Datei zugreifen will die so nicht mehr existiert. Gibts nicht ne try-anweisung die bei jeder art von Fehler die catch anweisung aufruft ?
Danke
Gruß Euro.
-
catch(...) fängt alles
Sollte bei mehreren catch-bLöcken logischweise der letzte sein^^
-
"try" überwacht bzw. sichert den nachfolgenden Block, "catch(typ e)" bzw. "catch(typ& e)" fängt alle Exceptions auf, die mit "throw e(..);" geworfen wurden. Was genau du da werfen/fangen mußt, hängt wohl von deinem Problem ab - wenn deine Dateiverarbeitung auf eine ungültige Datei mit einer eigenen Exception reagiert, kannst du die direkt auffangen. Wenn die Dateiverarbeitung z.B. das Flag "file.gone=true;" setzt, bevor sie sich verabschiedet, müßtest du das mit "if(file.gone) throw ...;" umwandeln.
Gibts nicht ne try-anweisung die bei jeder art von Fehler die catch anweisung aufruft ?
Hmm, es gibt die Möglichkeit
try { // Anweisungen } catch(...) { cerr << "ich hab' hier nen Fehler\n"; throw;//ich kenne den korrekten Fehler nicht, also räume ich nur meinen Kram auf und gebe den Fehler nach oben weiter }
(allerdings - wenn die Fehler nicht als Exception zurückgegeben werden (WinAPI nutzt z.B. meist den Rückgabewert für den Fehlerstatus), hilft dir try/catch nicht weiter)
PS: Nur mal interessehalber - was genau beabsichtigst du mit deiner Rekursion?