Kann man in C# irgendwie die Funktionsweise von Sprungmarken nachbilden?* ich habe eine Methode A() mit einer for-Schleife, die ein Array durchläuft und auf die Elemente mehrere Methoden in verschiedener Verschachtelung aufruft *B(), C(), D() und E() sollen in bestimmten Situationen die aktuelle Methode A() komplett abbrechen und neu starten *es handelt sich also um eine Form von Rekursion
Beispiel:
A() -> B()
A() -> B() -> C()
A() -> B() -> D()
A() -> B() -> D() -> E()
Um dies zu realisieren, kam ich nur zu einer Lösung mit Exceptions, denn A() soll ja abgebrochen und danach neu aufgerufen werden. Kann man aus einem Catch-Block einer Exception auch direkt eine übergeordnete Methode abbrechen und neu starten? Sonst müsste man ja jede Methode mit einem try-catch-Block versehen und die Exception weiterleiten bis zu A()… was den Code ja unübersichtlich macht.
Exceptions sollen ja eigentlich auch nur für Fehler verwendet werden und nicht für den Programmablauf. Wie kann man so etwas verwirklichen? Denn Sprungmarken gibt es in C# ja nicht!
OO gibts seit Platon - hatte der auch C#?
Hallo CWolle,
wie Exceptions funktionieren solltest du wissen. Natürlich braucht man nicht in jeder Methode ein try/catch/throw, um eine Exception weiterzuwerfen, sondern eine Exception wird automatisch soweit nach oben geworfen und beendet dabei alle Methoden, bis sie auf einen try/catch-Block stößt, in dem sie gefangen wird. (Hier sind wir bereits bei [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
Allerdings sind Exception wirklich nicht zur Steuerung des Kontrollflusses gedacht, sondern für - wie der Name sagt - Ausnahmesituationen.
Wenn du die Methoden einfach abbrechen willst, weil z.B. das Ergebnis bereits gefunden wurde und nicht weiter gesucht werden muss, sind Exceptions nicht der richtige Weg. Gibt den Methoden einen boolschen Rückgabewert, der angibt, ob die aufrufende Methode sofort beendet werden soll oder nicht. Prüfe bei jedem Aufruf den Rückgabewert und rufe return true auf, wenn er true ist.
Aus gutem Grund ist goto verpöhnt und über Methodengrenzen hinweg funktioniert es sowieso nicht. Es gibt also keinen direkten Weg, um aus E nach A zu springen.
herbivore
Hi,
jede Methode könnte einen Rückgabewert haben, der anzeigt ob die Methode "erfolgreich" war. Sagen wir mal boolean.
Wenn nun ein Aufrufer feststellt, dass eine aufgerufene Methode false zurück gegeben hat, dann wird die Verarbeitung gestoppt und die Methode gibt selbst auch wiederum false zurück. So wird das false bis zum ersten Aufrufer (Methode A) durchgereicht und auch dieser kann entsprechend regieren.
MfG
wax
edit: ok zu langsam 😃