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?
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.
Obwohl Sie wahrscheinlich den Call-Stack lesen und analysieren können, würde ich das nicht tun.
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%Tags und Links c# reflection stack-overflow