_FileReadToArray Error:2 (leere Datei)

  • Hallo allerseits,
    ich habe zurzeit das Problem, dass wenn mal _FileReadToArray eine leere Datei (0kb groß) ausliest, die Funktion mein ganzes Script abbricht. Dies möchte ich gern vermeiden, weiß aber leider nicht wie. Auch wenn _FileReadToArray fehlschlägt, soll das Script weiterhin ausgeführt werden.

    Das hier ist der Grundgedanke:

    [autoit]


    For $i = 1 To $var1[0]
    If Not _FileReadToArray($var1[$i], $var2) Then
    _Error("Read to Array", $var1[$i] & " Error: " & @error)
    ContinueLoop ; Funktioniert nicht!
    Else
    ;~ Hier gehts ganz normal weiter
    EndIf
    Next

    [/autoit]

    Ich weiß auch nicht, ob es Sinn macht, die Dateigröße abzufragen. Immerhin will ich alle Dateitypen einlesen können. Hat vielleicht jemand ne Idee?

    Einmal editiert, zuletzt von Sora White Dragon (10. September 2013 um 21:23)

  • Wozu dieses ContinueLoop? Der Else-Teil wird ja nicht ausgeführt, falls die 1. If-Bedingung wahr ist :huh:

    (Suchst du evtl. ExitLoop? Vergleich mal ContinueLoop und ExitLoop in der Hilfe ;))

    P.S.: In AutoIt gibt es sowas wie "nicht funktionierend" nicht. Es wird/wurde von Tausenden Leuten über Jahre gestest. Evtl. Gibt hin und wieder 'n kleinen Bug, aber sowas eher nur in der Beta. Man muss nur die Befehle verstehen und richtig einsetzen ;)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Um den Fehler zusammen mit anderen zu finden ist es fast unerlässlich ein direkt lauffähiges Minimalskript zu posten mit welchem andere den Fehler bei sich reproduzieren können.
    Das Skript welches du hier gepostet hast erfüllt diese Anforderung nicht weswegen ich dann erst einmal selbst das Skript erweitern musste um es lauffähig zu bekommen.
    Habe es folgendermaßen abgeändert:

    Zum lauffähigen Minimalskript erweitert
    [autoit]

    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $var2
    Global $var1 = _FileListToArray(@ScriptDir, "*.*", 1)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $var1[0]
    If Not _FileReadToArray($var1[$i], $var2) Then
    MsgBox(48, "Read to Array", $var1[$i] & " Error: " & @error)
    ContinueLoop ; Funktioniert nicht!
    Else
    ConsoleWrite("Klappt: " & $var1[$i] & @CRLF)
    EndIf
    Next

    [/autoit]


    So wie das Skript jetzt da steht macht es bei mir exakt das was es soll.
    Und ich denke wenn du es bei dir ausführst wird das ebenso sein.
    Der Hintergrund warum ich so auf ein lauffähiges Minimalskript, welches den Fehler reproduziert, poche, ist dass man beim Minimalisieren des eigentlichen Skriptes meistens feststellt, dass der Fehler am Ende doch woanders lag als eigentlich vermutet.
    Du vermutest z.B. dass das Continueloop fehlerhaft ist.
    Warum kann der Fehler aber nicht in deiner, für uns unbekannten, Funktion _Error() stecken (kommt da ein Exit oder ähnliches vor?)?
    Bei einem Minimalskript hättest du diese Funktion erst einmal entfernt (oder mit gepostet damit andere diese auch testen können) und könntest diese entweder ausschließen oder als Übeltäter überführen.

  • Ich könnt mir echt ein Kopfschuss geben.. einfach nur, weil ich so blöd war und nicht daran gedacht habe, dass der Fehler auch in meiner _Error() Funktion sein kann. Wie du richtig annahmst, war in meiner _Error() Funktion noch ein Exit drin. Und ich nahm die ganze Zeit an, dass _FileReadToArray() mein Script abbrechen würde, wenn es eine leere Datei ausliest... Daher danke ich dir auch für den Hinweis!

    In Zukunft werde ich auch nur noch lauffähige Minimalscripte posten mit den darin enthaltenen Funktionen, damit der Fehler auch schnell zu finden ist. An dieser Stelle auch ein Danke an alle, die mir versucht haben zu helfen, obwohl der Fehler in meiner eigenen Dummheit lag. Echt schlimm sowas :pinch:

    PainTain
    Wie oben schon erwähnt, dachte ich dass _FileReadToArray() mein Script abbrechen würde, wenn es einen Fehler hat. Das Continueloop war daher nur für das Beispiel um es deutlicher zu machen und weil ich es vorher mal getestet hatte. Es stimmt zwar, dass in AutoIT kaum Fehler sind, aber es gibt ja gewisse Grenzen. Ich wusste daher halt nicht, ob es eben diese war :D

    Einmal editiert, zuletzt von Sora White Dragon (10. September 2013 um 23:04)

  • Hi,

    Zitat

    Wie oben schon erwähnt, dachte ich dass

    Minimalscript hin oder her, mit einem einfachen ALT-D in jeder Zeile hättest du sofort in der Console gesehen, dass deine Funktion nicht verlassen wird....
    Wenn ich nicht weiss wo mein Script "aussteigt", dann lokalisiere ich den Fehler so.
    Alternativ über ein "Extras/Add Trace Lines" in Scite.
    Möglichkeiten gibt es viele....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (11. September 2013 um 17:11)