If _Funktion() = @error | Gibt kein @error zurrück

  • Hallo,
    kann mir bitte jemand erklären, weshalb beim Test 1 kein @Error zurückgegeben wird?
    Erst wenn ich SetError(1) setze, gibt mir der erste Test auch ein @Error aus.

    Ich komme wirklich nicht dahinter, wieso das so ist :(

    [autoit]

    If _TestFunktion() = @error Then ;~ Test 1
    MsgBox(0, "Error-MSG1:", @error)
    Else
    MsgBox(0 , "Error-MSG1", "Das sollte jetzt nicht passieren.")
    EndIf

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

    _TestFunktion() ;~ Test 2
    If @error Then
    MsgBox(0, "Error-MSG2:", @error)
    Else
    MsgBox(0 , "Error-MSG2", "Das sollte jetzt nicht passieren.")
    EndIf

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

    Func _TestFunktion()
    Return SetError(3)
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von MikroMirko (6. Juli 2012 um 18:58)

  • Error bezieht sich immer auf die zuletzt aufgerufene Funktion und hat nur einen Wert wenn diese Funktion auch @error einen Wert zuweist.
    Der Rückgabewert ist der Wert einer Funktion welcher durch Aufruf von Return nach außen zurückgegeben wird.

    Jetzt wieder zurück zu deinem Beispiel:

    [autoit]

    If _TestFunktion() = @error Then

    [/autoit]


    Das bedeutet du vergleichst den Rückgabewert der Funktion _TestFunktion mit dem aktuellen Wert von @error.
    Die zuletzt aufgerufene Funktion vor der @error-Abfrage ist _TestFunktion(). Dort wurde die Funktion mit Return SetError(3) beendet.
    Also hat @error zum Zeitpunkt der Abfrage den Wert 3. (wenn man stattdessen If @error = _TestFunktion() Then schreiben würde wäre das nicht so)
    Der standardmäßige Rückgabewert von SetError ist 1. Diese wird durch Return als Rückgabewert der Funktion _TestFunktion() zurückgegeben.

    Das bedeutet zusammengefasst dass in der If-Verzweigung folgender Vergleich übrig bleibt:

    [autoit]

    If 1 = 3 Then

    [/autoit]

    Und dies ist immer False.
    Willst du auch den Rückgabewert von SetError() beeinflussen schau dir in der Hilfe zu dieser Funktion den 3. Parameter an.

  • stimmt

    Test 2 funktioniert, aber ist auch nicht richtig den was hinter else kommt ist ja kein error.
    dh.: hinter else machst du das wenn kein error ist. Aber das else kannst dir dann auch sparen.

    [autoit]

    _TestFunktion() ;~ Test 2
    If @error Then MsgBox(0, "Error-MSG2:", @error) ; die msgbox kommt nur wenn in der Func Return SetError(x) war
    ; weiterer scriptverlauf

    [/autoit]

    sollte es so sein das dir _TestFunktion() normalerweise einen wert return´d wenn kein fehler ist schaut das zb. so aus.

    [autoit]

    $ValueOf_TestFunktion = _TestFunktion()
    If @error Then MsgBox(0, "Error-MSG1:", @error) ; die msgbox kommt nur wenn in der Func return @error war
    ; weiterer scriptverlauf

    [/autoit]

    Du kannst aber auch einen Wert zurückgeben und einen error setzten.
    in diesem Beispiel ist $ValueOf_TestFunktion mit dem string "Fehler" gefüllt und @error mit 3

    [autoit]

    $ValueOf_TestFunktion = _TestFunktion()
    If @error Then MsgBox(0, "Error-MSG1:", @error) ; die msgbox kommt nur wenn in der Func return @error war
    ; weiterer scriptverlauf

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

    Func _TestFunktion()
    Return SetError(3, 0, "Fehler")
    EndFunc

    [/autoit]

    der Wert @error wird aber nach jeder gestarteten Funktion von AutoIt zurückgesetzt, dh das Beispiel funktioniert nicht richtig ;)

    [autoit]

    _TestFunktion()
    MsgBox(0, "nachricht", "blablabla")
    If @error Then MsgBox(0, "Error-MSG1:", @error) ; @error wurde wegen MsgBox zurückgesetzt, gibt dir MsgBox keine error aus wird die zeile nicht ansprechen
    ; weiterer scriptverlauf

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

    Func _TestFunktion()
    Return SetError(3)
    EndFunc

    [/autoit]

    is eh einfach
    mfg Dominic

    2 Mal editiert, zuletzt von D2thunder (6. Juli 2012 um 19:00)

  • Danke für deine super Erklärung, AspirinJunkie!

    Also setze ich jetzt "return value" auf 0, damit der Rückgabewert nicht mehr 1 ist.
    Und mit "SetError(3, 0, 0)" gibt nun endlich auch Test 1 den Fehler aus :)

    @D2thunder
    Auch dir ein riesen Dankeschöönnn... :)