Rueckgabewert ermitteln @error?

  • Hi Leutz,

    ich habe mal eine grundsaetzliche Frage zu den @error Codes.


    FileExist(d:\temp\blabla.txt)

    If @error Then
    MsgBox(0, "Die Datei", @error)
    EndIf

    Aber @error ist immer 0, egal ob es das gibt oder nicht!?!?
    In der Hilfe steht, dass man den @error Code selbst setzen soll?!?!
    Ich wollte doch nur wissen, wie man abfragen kann, ob die letzte Funktion ohne Felher durch lief...

    Bei Unix ist das einfach echo $?.

    Hab ich da was falsch verstanden?


    CAT

  • Nein @error ist nicht immer 0.
    Wenn die Funktion so geschrieben ist das ein Fehler in der @error-Variable vermerkt wird dann kann man diese nutzen um die Funktion, unmittelbar nach Funktionsaufruf, auf Fehler zu überprüfen.
    Dies ist in der Regel in der Dokumentation zu der jeweiligen Funktion vermerkt.
    Bei FileExist() ist das nicht so - ein Error wird nicht gesetzt weil alleine der Rückgabewert schon Rückschlüsse auf eventuelle Fehler zulässt - entweder die Datei ist da oder nicht - da braucht man kein @error.

    Beispiel FilegetSize() - ist die angegebene Datei nicht vorhanden erhält @error den Wert 1.

    Das mit dem Error selbst setzen ist logischerweise nur sinnvoll wenn man eigene Funktionen deklariert und eben deren Erfolg auch in der @error-Variable vermerken will.

    • Offizieller Beitrag

    Wenn kein Fehler auftritt ist @error i.A. 0
    Üblich ist den Rückgabewert einer Funktion bei Erfolg mit -1 zu setzen und bei Fehler mit 0

    Um individuelle Fehlerwerte zu vergeben arbeitest du mit SetError().
    z.B. übergebene Variable ist kein Array, obwohl Funktion das verlangt
    bzw.
    Array ist 2-dimensional, aber 1-dimensional wird verlangt.

    [autoit]

    Func FunctionXY($array)
    If Not IsArray($array) Then
    SetError(1)
    Return 0
    EndIf
    Dim $Dimension = UBound($array,2)
    If Not @error Then
    SetError(2)
    Return 0
    EndIf
    ;.....
    EndFunc

    [/autoit]


    Um eine Fehlerbehandlung einzuleiten setzt du einfach nach einem Befehlsaufruf:

    [autoit]

    If @error Then
    ; hier kannst du z.B. Fehlerwerte abfragen und entsprechend auswerten
    Switch @error
    Case 1
    MsgBox(0,'','Variable ist kein Array')
    Case 2
    MsgBox(0,'','Array ist 2-dimensional')
    EndSwitch
    EndIf

    [/autoit]
  • @aspju

    Checks if a file or directory exists.
    FileExists ( "path" )
    Parameters
    Path The directory or file to check.
    Return Value

    Success: Returns 1.
    Failure: Returns 0 if path/file does not exist.

    Wie kann ich denn den return value von exist dann abfragen?

    ok die unterschiedlichen @error Codes habe ich nun getestet.
    Warum er allerdings bei FileExist das nicht 'richtig' macht?!?!

    also der Error code ist ob eine funktion geklappt hat oder nicht.
    der return code ist der Rueckgabewert?
    Und wie kann ich den auslesen?


    So sieht das im Unix aus, was ich machen moechte:

    error_func()
    {
    if [ $1 -ne 0 ]
    then
    echo "Es ist ein Fehler aufgetreten!"
    exit 1
    fi
    }


    Aufruf: error_func $?

    Einmal editiert, zuletzt von cat1510 (10. Oktober 2007 um 16:58)

    • Offizieller Beitrag
    Zitat

    Wie kann ich denn den return value von exist dann abfragen?

    [autoit]

    $Rueckgabewert = Funktion()
    ;also
    $Return = FileExists()

    [/autoit]

    Da der Return aber nur 1 (Erfolg) oder 0 (Fehler) ist, hast du somit den Return als Boolschen Wert und kannst so abfragen

    [autoit]

    If FileExists() Then
    ; Erfolg
    Else
    ; Fehler
    EndIf

    [/autoit]
  • Verstanden! Danke.

    Ist es denn moeglich den Return Code auch eine Zeile spaeter zu verarbeiten? bzw nach einer Funktion?

    Also:

    Code
    FileExist( "d:\irgendwas)
    Rueckgabewert = hat geplappt ( 1 )

    Oder muss ich dass dann IMMER erst in eine Variable schreiben?
    Siehe Dein Beispiel?

    es geht einfach darum, nach jeder Zeile Code eine udf aufzurufen, die prueft oder der Return Value richtig ist.

    2 Mal editiert, zuletzt von cat1510 (10. Oktober 2007 um 19:37)

  • Cool genauso habe ich mir das gerade auch gedacht :)

    Mein Favorit ist dann Loesung1
    Nach Loesung 1 habe ich das mal fuer die Nachwelt aufgeschrieben ;o) :

    [autoit]


    Func errorfunc($commando)
    $errorfunc = $commando
    If $errorfunc Then
    ; ist alles gut
    MsgBox(0, "Ordner", $errorfunc)
    Else
    ; hat nicht geklappt
    MsgBox(0, "Ordner", $errorfunc)
    EndIf

    EndFunc

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

    errorfunc(FileExists( "e:\temp" ))

    [/autoit]

    Einmal editiert, zuletzt von cat1510 (10. Oktober 2007 um 19:55)

  • Kann mir jemand sagen, warum meine Idee nicht funktioniert?

    [autoit]

    $var1 = 0
    $var2 = 0

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

    Func errorfunc($commando , $done , $failed)
    $errorfunc = $commando
    If $errorfunc Then
    ; ist alles gut
    $done = $done + 1
    Else
    ; hat nicht geklappt
    $failed = $failed + 1
    EndIf

    EndFunc

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

    errorfunc(FileExists("d:\temp") , $var1 , $var2)

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

    MsgBox(0, "Ordner", $var2 & " oder " & $var1)

    [/autoit]