Verhinderung von StackOverFlow, die in rekursiven Funktionen
Ich habe eine rekursive Funktion in eine BaseClass
die sich auf eine protected virtual
Funktion für seine Rückkehr Zustand.
Ist es möglich für eine Kind-Klasse zu überschreiben diese Funktion falsch und führt zu einer StackOverFlow
Ausnahme. Das Schlimmste ist, es gibt einige langsame Netzwerk-Aufrufe und die Ausnahme ist nicht gonna happen soon (viele Ressourcen verschwenden, die für eine lange Zeit).
Ich bin auf der Suche nach einer Methode, um zu überprüfen StackOverFlow
in frühen Stadien gewisser Weise in der Basis-Klasse (die vielleicht Reflection
und der aktuellen rekursionsebene).
Irgendeine Idee ?
- ^Stimmen zum Thema zu stackoverflow.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man an eine einfache integer 'Tiefe' der rekursiven Funktion und erhöht ihn bei jedem folgenden Aufruf. Wenn es größer wird als die maximal erlaubte Tiefe eine Ausnahme genau dann, anstatt zu warten, bis es zu spät und der gefürchtete
StackOverflow
Ausnahme aufgetreten ist.Solche Sicherheitsmechanismen (Zähler erhöhen, überprüfen, ist es nicht dumm zu groß) kann auch hilfreich sein, in
while
Schleifen, wo ein kleiner Fehler kann eine unendliche Schleife verursachen, verbrauchen große Mengen an CPU.In großen Systemen mit vielen Benutzern (z.B. web-sites), manchmal ist es besser, Vorsorgemaßnahmen zu ergreifen, wie diese mit Rekursion und while-Schleifen, denn die Konsequenzen können weit über eine web-Seite oder ein Benutzer des Systems. Es ist nicht schön-code und die Puristen kein Zweifel, sträuben sich, aber es ist effizient, es ist defensive und es ist pragmatisch.
bool RecursiveConditionMethod(ref int depthLevel) { depthLevel++; // if (depthLevel > MAX_DEPTH_LEVEL) break the loop
ist es OK ?Das problem lösen, anstatt einen workaround. Erstellen Sie eine private Funktion, die rekursiv die Anrufe, die geschützte virtuelle Funktion.
Obwohl Sie wahrscheinlich Lesen können, den call-stack und zu analysieren, würde ich nicht tun.
Alternative sein könnte zu tun, den call-stack-Analyse im DEBUG-Modus nur. Hier ist ein wenig code, um zu sehen, wie man den call-stack.
Von dieser Seite