javascript return try-catch try-catch-finally try-finally

javascript - document.title jquery



¿Por qué una devolución en `finalmente` anula` try`? (7)

¿Cómo funciona una declaración de devolución dentro de un bloque try / catch?

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

¡Espero que la salida de esta función sea true , pero en cambio es false !


¿Qué hay de esto?

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


Cuando finally usa, cualquier código dentro de ese bloque se dispara antes de que el método salga. Como está utilizando una devolución en el bloque finally , llama a return false y anula la return true anterior en el bloque try .

(La terminología puede no ser del todo correcta)


De acuerdo con ECMA-262 (5ed, diciembre de 2009), en pp. 96:

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

  1. Deje B ser el resultado de evaluar Block.
  2. Deje F ser el resultado de evaluar finalmente.
  3. Si F.type es normal, devuelva B.
  4. Retorno F.

Y de la página 36:

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

Está claro que return false establecería el tipo de finalización de finally como return , que causaría try ... finally to 4. 4. Devuelve F.


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

Deberá cambiar su código para que se parezca más a esto:

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

En general, nunca desea tener más de una declaración de devolución en una función, este es el motivo.


Finalmente, se supone que SIEMPRE debe ejecutarse al final de un bloque try catch para que (por especificación) sea el motivo por el que recibe un falso return. Tenga en cuenta que es muy posible que diferentes navegadores tengan diferentes implementaciones.


Hasta donde yo sé, el bloque finally siempre se ejecuta, independientemente de si tiene una declaración de return dentro de 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.


por qué estás obteniendo el resultado falso es que regresaste en un bloque final. finalmente el bloque debería ejecutarse siempre. por lo que su return true cambios para return false

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