¿Por qué una vuelta en `por fin` reemplazar `try`?

¿Cómo funciona una sentencia return dentro de un bloque try/catch trabajo?

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

Estoy esperando la salida de esta función para ser true, pero en su lugar es false!

InformationsquelleAutor bonfo | 2010-10-01

8 Kommentare

  1. 78

    Finalmente siempre ejecuta. Eso es lo que es, lo que significa que es el rendimiento que se usa en su caso.

    Tendrá que cambiar su código, así que es más como este:

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

    Generalmente hablando, usted nunca desea tener más de una instrucción return en una función, cosas como esta son de por qué.

    • Yo diría que más de uno instrucción return no siempre es malo – Consulte stackoverflow.com/questions/36707/… para más discusión.
    • +1 buena respuesta. no están de acuerdo en una vuelta en una función, aunque.
    • Yo también discrepan sobre el retorno de la regla. Nunca se debe volver a partir, por último, a pesar de que (en C#, incluso no está permitido).
    • ese es un buen punto. Una vuelta fuera de la T-C-F bloque podría ser mejor, pero el código de ejemplo sería un poco forzado 🙂
    • no es una regla dura y rápida, pero la mayoría de la copunter-ejemplos en los que el hilo es bastante artificial, y el único válido en el caso de que yo veo es la «guardia de la cláusula» (básicamente el patrón de comprobación de los datos de entrada en la parte superior de la función y devolver condicional). Eso es perfectamente válido caso, pero realmente esas devoluciones deben ser excepciones (de nuevo, no duro y rápido).
    • En realidad en IE6 y IE7, finalmente, no siempre se ejecutan en todos los casos debido a un muy grave error del navegador. Específicamente – si se produce una excepción en un intento por último bloque que no está rodeado por un mayor nivel de try-catch, a continuación, el bloque finally no se ejecutará. He aquí un caso de prueba jsfiddle.net/niallsmart/aFjKq. Este problema se corrigió en IE8.

  2. 33

    De acuerdo con ECMA-262 (5ed, diciembre de 2009), en las páginas 96:

    La producción TryStatement : try Block Finally se evalúa de la siguiente manera:

    1. Deje B ser el resultado de la evaluación del Bloque.
    2. Sea F el resultado de la evaluación Finalmente.
    3. Si F. tipo es normal, volver B.
    4. Volver F.

    Y de p 36:

    El tipo de Terminación se utiliza para explicar el comportamiento de las declaraciones (break, continue, return y throw) que realizan no locales transferencias de control. Los valores del tipo de Terminación son tripletas de la forma (tipo, valor, destino), donde tipo es uno de normal, break, continue, return, o throw, valor es cualquier lenguaje ECMAScript valor o vacío, y objetivo es cualquier ECMAScript identificador o vacío.

    Es claro que return false establecer tipo de terminación de finalmente como volver, que causa try ... finally hacer 4. Retorno F.

    • más clara la respuesta aquí
  3. 12

    Cuando se utiliza finally, cualquier código dentro de ese bloque de incendios antes de que el método de las salidas. Porque estás usando un retorno en la finally bloque, llama return false y anula la anterior return true en el try bloque.

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

  4. 3

    por qué usted está recibiendo falso, es devuelto en un bloque finally. por último bloque se debe ejecutar siempre. por lo que su return true cambios a return false

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

    Hasta donde yo sé, el finally bloque siempre ejecuta, independientemente de si usted tiene un return instrucción dentro de try o no. Ergo, se obtiene el valor devuelto por la return instrucción dentro del bloque finally.

    He probado con Firefox 3.6.10 y Chrome 6.0.472.63 tanto en Ubuntu. Es posible que este código puede comportarse de forma diferente en otros navegadores.

  6. 0

    El bloque finally se reescribe bloque try retorno (en sentido figurado).

    Sólo quería señalar, que si devuelve algo de por último, será devuelto de la función. Pero si finalmente no hay un ‘retorno’ de la palabra – se le devolverá el valor de bloque try;

    function example() {
        try {
            return true;
        }
        finally {
           console.log('finally')
        }
    }
    console.log(example());
    //-> finally
    //-> true

    Por lo que-finalmente- return reescribe el retorno de -intentar- return.

  7. -2

    Finalmente, se supone que para que se ejecute SIEMPRE al final de un bloque try catch, de modo que (por especificación) es la razón por la que usted está consiguiendo devuelve false. Tenga en cuenta que es totalmente posible que los diferentes navegadores tienen diferentes implementaciones.

    • IE8, Firefox 3.6 y Chrome 6: todos la misma 😉
  8. -3

    Lo que acerca de esto?

    doubleReturn();
    
    function doubleReturn() {
      let sex = 'boy';
    
      try {
        return sex;
    
        console.log('this never gets called...');
      } catch (e) {} finally {
        sex = 'girl'; 
    
        alert(sex);
      }
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea