2010-10-01 15 views
50

¿Cómo funciona una instrucción return dentro de un bloque try/catch?Javascript: try/catch/finally return statement

function example() { 
    try { 
     return true; 
    } 
    finally { 
     return false; 
    } 
} 

¡Espero que la salida de esta función sea "verdadera", pero en cambio es "falsa"!

+1

El texto de su pregunta y el título preguntan sobre 'try'/**' catch' **, pero su código utiliza 'finally'? – Bergi

Respuesta

53

Finalmente siempre ejecuta. Para eso es, lo que significa que su devolución se usa en su caso.

Usted querrá cambiar su código por lo que es de la misma familia:

function example() { 
    var returnState = false; // initialisation value is really up to the design 
    try { 
     returnState = true; 
    } 
    catch { 
     returnState = false; 
    } 
    finally { 
     return returnState; 
    } 
} 

En términos generales nunca desea tener más de una instrucción de retorno en una función, cosas como esta son por qué.

+20

Yo diría que tener más de una declaración de devolución no siempre es malo - Ver http://stackoverflow.com/questions/36707/should-a-function-have -únicamente una declaración de devolución para más discusión. – Castrohenge

+3

+1 buena respuesta. no está de acuerdo en una vuelta en una función sin embargo. –

+3

Yo también estoy en desacuerdo sobre la regla de devolución. Sin embargo, nunca deberías volver por fin (en C#, ni siquiera está permitido). – erikkallen

5

Cuando usa finally, cualquier código dentro de ese bloque se dispara antes de que el método finalice. Como está utilizando un retorno en el bloque finally, llama al return false y anula el return true anterior en el bloque try.

(Terminología podría no ser del todo bien.)

0

Por lo que yo sé, los bloques finallysiempre ejecuta, independientemente de si usted tiene una declaración return dentro try o no. Ergo, obtienes el valor devuelto por la instrucción return dentro del bloque finally.

Probé esto con Firefox 3.6.10 y Chrome 6.0.472.63 ambos en Ubuntu. Es posible que este código se comporte de manera diferente en otros navegadores.

3

por qué está recibiendo un error es devuelto en un bloque finally. finalmente el bloque debería ejecutarse siempre. por lo que sus return true cambios en return false

function example() { 
    try { 
     return true; 
    } 
    catch { 
     return false; 
    } 
} 
-1

Por último se supone que debe funcionar siempre al final de un bloque intento de captura de manera que (por la especificación) es por eso que está recibiendo falsa devuelto. Tenga en cuenta que es muy posible que diferentes navegadores tengan diferentes implementaciones.

+0

IE8, Firefox 3.6 y Chrome 6: de todos modos;) – bonfo

20

Según ECMA-262 (5ED, diciembre de 2009), en pp. 96:

La producción TryStatement : try Block Finally se evalúa como sigue:

  1. Sea B el resultado de evaluar Block.
  2. Deje que F sea el resultado de la evaluación de Finally.
  3. Si F.type es normal, volver B.
  4. Volver F.

Y desde págs. 36:

El tipo de finalización se utiliza para explicar el comportamiento de los estados (break, continue, return y throw) que realizan transferencias de control no locales.Valores del tipo de finalización son triples de la forma (tipo, valor, objetivo), en donde tipo es uno de normal, break, continue, return, o throw, valor es cualquier valor lenguaje ECMAScript o vacío, y target es cualquier identificador de ECMAScript o está vacío.

Está claro que habría return false establecer el tipo de terminación de finalmente como de retorno, que causan try ... finally hacer 4. Volver F.

+0

más clara respuesta aquí –