2008-11-13 4 views
49

Ich habe den Verdacht, dass ich den finally Block falsch bin mit, und dass ich nicht verstehen, die Grundlagen ihres Zweckes ...Javascript Fehler bei Versuch Umgang .. fangen .. endlich

function myFunc() { 
     try { 
      if (true) { 
       throw "An error"; 
      } 
     } catch (e) { 
      alert (e); 
      return false; 
     } finally { 
      return true; 
     } 
} 

Diese Funktion führt den catch-Block aus, alarmiert "Ein Fehler", gibt dann aber true zurück. Warum kehrt es nicht falsch zurück?

Antwort

81

Der finally-Block enthält Anweisungen, die ausgeführt werden, nachdem die try- und catch-Blöcke ausgeführt wurden, aber vor den Anweisungen, die der try ... catch-Anweisung folgen. Der finally-Block führt aus, ob eine Ausnahme ausgelöst wird oder nicht. Wenn eine Ausnahme ausgelöst wird, werden die Anweisungen im finally-Block ausgeführt, auch wenn kein catch-Block die Ausnahme behandelt. more

Der finally Block immer ausgeführt wird, versuchen Sie true nach dem try Block Rückkehr

function myFunc() { 
    try { 
     if (true) { 
       throw "An error"; 
      } 
      return true; 
    } catch (e) { 
      alert (e); 
      return false; 
    } finally { 
      //do cleanup, etc here 
    } 
} 
10

Schließlich Blöcke ausführen, wenn Sie den Try-Block verlassen. In Ihrem Code passiert dies, wenn Sie false zurückgeben. Dies setzt den Rückgabewert auf "false" und versucht, die Funktion zu beenden. Aber zuerst muss es den try-Block verlassen, der den finally auslöst und den Rückgabewert auf true überschreibt.

Es wird von vielen als eine gute Programmierpraxis angesehen, eine einzelne Return-Anweisung pro Funktion zu haben. Ziehen Sie in Erwägung, am Anfang Ihrer Funktion eine var retval zu setzen und sie in Ihrer Funktion auf wahr oder falsch zu setzen und dann den Code so zu strukturieren, dass er bis zu einer einzigen Rückkehr am unteren Ende der Funktion reicht.

+16

Die Verwendung eines einzelnen Rückgabewerts ist eine gültige und nützliche Strategie zur Lösung des Problems der Vereinfachung der Absicht und der Klarheit der Funktionen. Die Verwendung einer Variablen zum Speichern des Rückgabewerts ist ebenfalls ein gültiges Mittel zum Lösen einer komplizierten Rückgabewertlogik. Ich glaube jedoch nicht, dass man sagen kann, dass mehrfache Rückgabeanweisungen in einer Funktion automatisch Zeichen einer schlechten Programmierpraxis sind. In vielen Fällen ist es einfach in Ordnung: einfacher im Schreiben des Codes und klar in der Übertragung der Absicht der Funktion zu dem nächsten Programmierer, der es verstehen muss. 'function a (i) {if (i === undefiniert) {return;} ...}' – ErikE

+5

Diese Return-Anweisung oben ist sehr klar. Das Erzwingen der gesamten Funktion innerhalb eines if-Blocks ist nicht notwendig. – ErikE

1
function getTheFinallyBlockPoint(someValue) { 
    var result; 
    try { 
     if (someValue === 1) { 
      throw new Error("Don't you know that '1' is not an option here?"); 
     } 
     result = someValue 
    } catch (e) { 
     console.log(e.toString()); 
     throw e; 
    } finally { 
     console.log("I'll write this no matter what!!!"); 
    } 

    return result; 
}; 

getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!"); 
getTheFinallyBlockPoint(1); 

Führen Sie dies auf der Konsole Ihres Browsers und es könnte Ihnen die Antwort geben, die Sie suchen.