_StringBetween @error - Stack Overflow - Funktion in Funktion

  • Hallo sorry für den irreführenden Titel aber ich benötige kurz eure Hilfe zu meinem Problem, was ich nicht genau beschreiben kann.

    Func _Bla($sTest)
    [...]
    $sBetween = _StringBetween($sString, "abc'", "efg'")
    If @error Then
    _Bla($sTest)
    ConsoleWrite("error")
    Else
    Return $capt[0]
    EndIf
    Jetzt kommt nun ein error (angeblich in der [lexicon]winhttp[/lexicon].au3, was ich jedoch nicht denke, da ich hier einfach die Funktion in der Funktion aufrufe und das Theroretisch gesehen immer wieder, jedoch muss es ja bei einem 2. mal oder 3. mal ne andere Antwort geben, da ich noch anderen Code davor hab, der immer wieder einen anderen String hat.
    Weiß jemand wie ich das hier ändern könnte?


    Kleine Info:
    Ich habe eine Hauptschleife, bei der die Funktion ebenfalls mehrmals aufgerufen wird, jedoch mit anderen Atrributen.


    Beispiel:

    While 1
    ConsoleWrite(_Bla(123))
    ConsoleWrite(_Bla(1234))
    WEnd

  • 1. Du bekommst eine Fehlermeldung? Wie wäre es wenn du uns mitteilst, was diese Fehlermeldung dir mitteilen will? :rolleyes:
    2. Wenn die Fehlermeldung auf die WinHTTP.au3 verweist, wie kommst du dann darauf, dass dein Code-Auszug, welcher keinerlei WinHTTP Funktionen enthält und nicht Teil der UDF ist, uns bei der Problemsuche helfen kann?
    3. Wann genau tritt der Fehler auf bzw. Nach wie vielen Rekursionen stürzt AutoIt ab?
    4. Rekursive Funktionen die neben _StringBetween WinHTTP Funktionen verwenden machen mich immer ein wenig skeptisch ;). Bist du sicher, dass du dein Problem nicht genauer beschreiben kannst? Wenn ja, warum denn?


  • 2. Wenn die Fehlermeldung auf die WinHTTP.au3 verweist, wie kommst du dann darauf, dass dein Code-Auszug, welcher keinerlei WinHTTP Funktionen enthält und nicht Teil der UDF ist, uns bei der Problemsuche helfen kann?


    Ich hab auch oft Verweise auf Fehlerquellen der Includes also in diesem Fall auf die WinHTTP.au3 obwohl nichts in dieser fehlerhaft ist. Kommt also durchaus vor, dass eine falsche Fehlerquelle angezeigt wird. Hilft nur eins, jede Zeile mit überprüfen lassen :D

  • WENN ich Funktionen rekursiv bearbeite, dann immer so, dass im Fehlerfall aus der Rekursion herausgesprungen wird. Alles andere macht absolut keinen Sinn!
    Func _Bla($sTest)
    [...]
    $sBetween = _StringBetween($sString, "abc'", "efg'")
    If @error Then
    _Bla($sTest)führt dazu, dass im Fehlerfall der Fehler immer wieder produziert wird, so lange, bis die maximale Rekursionstiefe erreicht wird!

  • führt dazu, dass im Fehlerfall der Fehler immer wieder produziert wird, so lange, bis die maximale Rekursionstiefe erreicht wird!


    Nicht zwangsläufig. Anhand des gekürzten Quellcodes kann man darüber keine Aussage machen. Die Variable $sTest, welche an den rekursiven Aufruf übergeben wird könnte zuvor geändert worden sein und muss nicht mehr den ursprünglichen Inhalt haben. Somit muss der rekursive Aufruf nicht zwangsläufig ebenfalls zum Fehler führen.


    Ansonsten stimme ich den anderen zu. Ohne exakte Fehlermeldung und ungekürzten Quellcode der relevanten Stellen wird hier kaum jemand helfen können.

  • Zitat

    Die Variable $sTest, welche an den rekursiven Aufruf übergeben wird könnte zuvor geändert worden sein und muss nicht mehr den ursprünglichen Inhalt haben. Somit muss der rekursive Aufruf nicht zwangsläufig ebenfalls zum Fehler führen.

    Der Sinn an einer rekursiven Funktion ist, im Fehlerfall reproduzierbar zum Abbruch zu kommen, da ansonsten der Stack überläuft, s. Script des TE.
    Ansonsten verwendet man die iterative Variante.
    Wenn man nicht rekursiv programmieren kann, sollte man es im Zweifelsfall lassen!


    //EDIT um zum Punkt zu kommen, wie willst du denn bei _StringBetween() innerhalb der Rekursion NICHT zum Fehler kommen um _Bla ohne Fehler verlassen zu können? Du müßtest den Fehlercode an _Bla() übergeben, dort bearbeiten und sicherstellen, daß _StringBetween() definitiv in ALLEN weiteren Aufrufen irgendwann KEINEN Fehler mehr erzeugt. Das geht im Sinne der Rekursion natürlich nur dann, wenn dieser Fall bereits in der Funktion _Bla() implementiert ist (was er nicht ist..) .
    Im Fehlerfall immer tiefer in eine Rekursion zu springen ohne sicherzustellen, dass dieser Fehler nicht mehr auftritt führt imho zu nicht reproduzierbaren Ergebnissen, s. Thread!

  • Ohne [...] ungekürzten Quellcode [...] wird hier kaum jemand helfen können.

    Oh doch bitte bitte gekürzt.
    Das sehe ich hier ja leider so oft - Problem tritt auf und 5000 Zeilen unübersichtlicher Quellcode wird gepostet - wenn überhaupt jemand Lust hat zu helfen wird es demjenigen damit verdammt schwer gemacht.
    Wenn man wirklich Hilfe will ist das wichtigste ein Minimalskript.
    Also ein Skript welches:

    • den beschriebenen Fehler reproduziert.
    • so klein wie möglich ist.
    • bei dem alles was nichts mit der Reproduzierung des Fehlers zu tun hat entfernt wurde.
    • direkt bei jedem ohne weitere Anpassung lauffähig ist damit das Skript von Helfenden auch getestet werden kann.


    Neben dem Vorteil, dass man damit deutlich mehr Helfende erreicht (da sie ja nicht mehr vom riesigen Codewust abgeschreckt werden) und Helfende schneller den Fehler finden können (wegen dem Fokus auf das Wesentliche) ist der zweite Vorteil, dass man in 80% der Fälle beim Kürzen des Quellcodes selbst auf die Lösung stößt.
    Denn so geht man ja beim Fehler suchen vor: Man grenzt ihn schrittweise ein.


    Aber ich verstehe natürlich was du eigentlich sagen wolltest. Hier hat der TS ja nur unzusammenhängende nicht lauffähige Codefetzen gepostet - das ist natürlich der absolute Worst-Case wenn man Hilfe möchte.

  • Deswegen hatte ich ja auch "der relevanten Stellen" geschrieben ;-) Dass hier niemand tausende Zeilen GUI Code oder anderen Code der nichts mit dem Fehler zu tun hat braucht sollte ja klar sein. Aber zumindestens die rekursive Funktion sollte man komplett mitliefern, denn da schlummert der Fehler ja anscheinend.


    EDIT:


    Andy


    Wie gesagt ohne die entfernten Stellen kann man nicht sagen ob er entsprechende Vorkehrungen getroffen hat. Die Variable $sString könnte abhängig von $sTest sein, d.h. bei entsprechender Änderung von $sTest in jeder Stufe kann zum einen stringbetween in der nächsten Stufe erfolgreich sein und zum anderen könnte vorher ein return kommen wenn $string keinen oder einen ungültigen Wert hat. Ohne Code aber alles nur theoretische Annahmen, vermutlich liegst du genau richtig und er hat eben keine entsprechende Abbruchbedingung implementiert.

  • Zitat von AspirinJunkie

    ist der zweite Vorteil, dass man in 80% der Fälle beim Kürzen des Quellcodes selbst auf die Lösung stößt.

    OMG, sag mal, weisst du eigentlich wieviel Zeit das kostet, ein lauffähiges Script zu erstellen, welches den eigenen Fehler reproduziert? Unverschämtheit, so etwas zu verlangen, während man doch irgendwelche Codefetzen oder 5000 Zeilen zusammenkopierten Quellcode posten kann und dann gemütlich einen Kaffee trinkt, während andere sich mit der Sch**** beschäftigen, die man selbst verzapft hat!
    Wahrscheinlich verlangst du als nächstes noch, dass man sich Methoden zum Debugging aneignet, um Fehler im Script selbst zu finden! Blasphemie!
    Wozu gibts denn sonst Foren mit Leuten die nur darauf warten irgendwelchen programmiertechnischen Müll vorgeworfen zu bekommen und diesen dann genau so hinzubiegen, wie man es gerne möchte? Wohlgemerkt nachdem man diesen Leuten nach dem x-ten Mal Nachfragen dann erklären muss, dass man es eigendlich ganz anders gemeint hatte....