Funktion so oft ausführen, bis fehlerfrei abgelaufen



  • Ich habe eine Funktion geschrieben, die durch gewisse Umstände bedingt ab und zu eine StackOverflowException verursacht.
    Nun möchte ich mittels try und catch diese Funktion so oft wiederholen lassen, bis die Fehlermeldung nicht wieder auftritt.

    Ich habe mich ein wenig in der Hilfe belesen und so gut es ging selbst versucht mir zu behelfen, aber meine Lösung liefert dennoch Programmabstürze durch besagten Fehler.

    int i;
    for (i=0;i<20;i++)
    {
        try
        {
            SOE_funct(i); //besagte Funktion
        }
        catch(std::exception &Error)
        {
            i--
        }
        //hier folgt weiterer Code, der nur dann ausgeführt werden soll, wenn kein
        //Fehler aufgetreten ist.
    }
    

    Das ist mein aktueller Stand. Könnte ich mein Programm wie folgt abwandeln, um den unteren kommentierten Code im Falle eines fehlerfreien Funktionsaufrufs auszuführen?

    for (i=0;i<20;i++)
    {
        Begin;
        try
        {
            SOE_funct(i); //besagte Funktion
        }
        catch(std::exception Error)
        {
            goto Begin;
        }
        //hier folgt weiterer Code, der nur dann ausgeführt werden soll, wenn kein
        //Fehler aufgetreten ist.
    }
    


  • Mittels Debugger habe ich herausgefunden, dass meine Funktion auch beim erstmaligen Ausführen das Programm zum Absturz bringt, aber sollte denn nicht genau das NICHT geschehen, wenn ich es in einem try-Block ausführe??



  • Warum sollte sich das deterministische Instrument der Welt bei einem zweiten Aufruf der gleichen Funktion anders verhalten als beim ersten Mal? Stackoverflow ist keine Ausnahme sondern ein Fehler.



  • Sinngemäß sieht die besagte SOE_funct so aus, dass eine zufällige Zahl zwischen 1 und 1000 gewählt wird und das ganze soll rekursiv so oft geschehen, bis die Zahl einen vorher festgelegten Wert annimmt. Bei zu vielen Rekursionen kommt es irgendwann zwangsläufig zu einer StackOverflowException.

    Das ist jetzt nicht der exakte Ablauf der Funktion aber so sinngemäß kommt es in etwa hin.



  • Du hast das Problem erkannt: Rekursion. Wenn dein Compiler diese Funktion nicht in eine while-Schleife verwandeln kann, dann musst du es selbst machen. Alles andere ist aehnlich wie dein Quelltext oben: einfach ... nicht gut.



  • Ich habe eine Lösung für mein Problem gefunden. 🙂 Nach 700 Rekursionsschritten folgt ein "return 0;" und ich lasse meine function so oft wiederholen, bis der Rückgabewert nicht mehr 0 ist.
    Problem gelöst. 😃

    Aber so 100% zufrieden bin ich noch nicht.... Microsoft schreibt zu der Thematik folgendes:

    In früheren Versionen von .NET Framework konnte die Anwendung ein StackOverflowException-Objekt abfangen (z. B. zum Wiederherstellen einer ungebundenen Rekursion). Diese Vorgehensweise wird zurzeit aber nicht mehr empfohlen, da wichtiger zusätzlicher Code erforderlich ist, um eine Ausnahme bei einem Stapelüberlauf verlässlich anzufangen und die Programmausführung fortzusetzen.

    Ab .NET Framework, Version 2.0, kann ein StackOverflowException-Objekt nicht mehr durch einen try-catch-Block abgefangen werden, und der zugehörige Prozess wird standardmäßig beendet. Infolgedessen wird Benutzern geraten, ihren Code so zu schreiben, dass ein Stapelüberlauf erkannt und vermieden wird.

    Meine Frage dazu: Wie lasse ich denn mein Programm vom selbst erkennen, ob ein besagter Absturz kurz bevorsteht?



  • Geht es hier um .Net? Dann bist du im falschen Forum.

    Meine Frage dazu: Wie lasse ich denn mein Programm vom selbst erkennen, ob ein besagter Absturz kurz bevorsteht?

    Gar nicht. Schreibe vernuenftigen Code und du hast das Problem nicht! Eine Stapelueberlauf ist ein Fehler des Programmierers und kann im Programm nicht im Allgemeinen behandelt werden.



  • Nungut, habe es jetzt nicht direkt mit einer Schleife gemacht sondern mit entsprechenden goto-Befehlen. Zusätzlich habe ich einen Schalter in das Programm eingebaut mit dem man zwischen rekursiv und iterativ umschalten kann.

    Dennoch frage ich mich, weshalb MS so etwas auf die Hilfeseite schreibt, wenn es doch nicht funktionieren soll. 😕



  • GR-Thunderstorm schrieb:

    Dennoch frage ich mich, weshalb MS so etwas auf die Hilfeseite schreibt, wenn es doch nicht funktionieren soll. 😕

    Du kannst ja den Stack Overflow abfangen und das Programm sauber sterben lassen, so dass kein Datenmüll zurückbleibt, alle Resourcen sauber abgeräumt werden und so weiter. Du solltest nur nicht versuchen, danach normal weiterzumachen.

    Reine Vermutung, aber wenn das nicht geht, ist es IMO in der Tat sinnlos.


  • Mod

    Nochmal die Frage: Redest Du von C++/CLI oder nativem Code?



  • Programmieren tue ich an sich mit VC++. Die try-catch Anweisung sollte afaik auch C++ sein, oder nicht?


Anmelden zum Antworten