Verhindern von StackOverFlow in rekursiven Funktionen

8

Ich habe eine rekursive Funktion in BaseClass , die auf einer protected virtual -Funktion für ihre Rückkehrbedingung beruht.

Es ist möglich, dass eine untergeordnete Klasse diese Funktion falsch überschreibt und zu einer StackOverFlow -Ausnahme führt. Das Schlimmste ist, dass es einige langsame Netzwerkanrufe gibt und die Ausnahme wird nicht bald passieren (viele Ressourcen verschwenden für eine lange Zeit).

Ich suche nach einer Methode, um StackOverFlow in frühen Stadien irgendwie in der Basisklasse zu überprüfen (vielleicht mit Reflection und der aktuellen Rekursionsstufe).

Irgendeine Idee?

    
Xaqron 28.01.2011, 06:31
quelle

3 Antworten

8

Sie könnten eine einfache Ganzzahl 'Tiefe' an die rekursive Funktion übergeben und sie bei jedem folgenden Aufruf inkrementieren. Wenn es größer wird als die maximal erlaubte Tiefe, wird ein Exception-Recht ausgelöst, anstatt zu warten, bis es zu spät ist und die gefürchtete StackOverflow -Ausnahme eingetreten ist.

Solche Sicherheitsmechanismen (Inkrementierungszähler, überprüfen Sie, dass es nicht dumm groß ist) können auch in while Schleifen nützlich sein, wo ein kleiner Fehler eine unendliche Schleife verursachen kann, die riesige Mengen an CPU verbraucht.

In großen Systemen mit vielen Benutzern (z. B. Websites) ist es manchmal am besten, Vorkehrungen wie diese mit Rekursions- und While-Schleifen zu treffen, da die Folgen weit über eine Webseite oder einen Benutzer des Systems hinausreichen können. Es ist kein hübscher Code und die Puristen werden ohne Zweifel daran scheitern, aber es ist effizient, es ist defensiv und es ist pragmatisch.

    
Ian Mercer 28.01.2011, 06:43
quelle
1

Lösen Sie das Problem, anstatt eine Problemumgehung zu erstellen. Erstellen Sie eine private Funktion, die rekursiv ist und die geschützte virtuelle Funktion aufruft.

    
jgauffin 28.01.2011 06:36
quelle
0

Obwohl Sie wahrscheinlich den Call-Stack lesen und analysieren können, würde ich das nicht tun.

  1. Es wird die Ausführung verlangsamen
  2. Es ist nicht die Verantwortung Ihrer Basisklasse
  3. Dokumentieren Sie das Verhalten Ihrer Basisklasse

Eine Alternative könnte sein, die Call-Stack-Analyse nur im DEBUG-Modus durchzuführen. Hier ist ein kleiner Code, um zu sehen, wie man den Call-Stack bekommt.

%Vor%

Von dieser Website

    
Erno de Weerd 28.01.2011 06:38
quelle

Tags und Links