Laden...

Realisierung von Sprungmarken über mehrere Methodenaufrufe hinweg

Erstellt von CWolle vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.241 Views
CWolle Themenstarter:in
57 Beiträge seit 2012
vor 12 Jahren
Realisierung von Sprungmarken über mehrere Methodenaufrufe hinweg

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#?

49.485 Beiträge seit 2005
vor 12 Jahren

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

731 Beiträge seit 2006
vor 12 Jahren

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 😃