¿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 lo es false
!
Respuestas:
Finalmente siempre se ejecuta. Para eso es, lo que significa que su retorno se usa en su caso.
Querrá cambiar su código para que sea más así:
En términos generales, nunca querrá tener más de una declaración de retorno en una función, este es el motivo.
fuente
Según ECMA-262 (5ed, diciembre de 2009), en págs. 96:
Y de las págs. 36:
Está claro que
return false
sería establecer el tipo de terminación de fin como de retorno , lo que causatry ... finally
que hacer 4. Volver F .fuente
Cuando lo usa
finally
, cualquier código dentro de ese bloque se activa antes de que salga el método. Debido a que está utilizando un retorno en elfinally
bloque, llamareturn false
y anula el anteriorreturn true
en eltry
bloque.(Es posible que la terminología no sea del todo correcta).
fuente
la razón por la que se está volviendo falso es que regresó en un bloque finalmente. finalmente el bloque debería ejecutarse siempre. entonces tu
return true
cambia areturn false
fuente
El bloque finalmente reescribe el retorno del bloque de prueba (en sentido figurado).
Solo quería señalar que si devuelve algo de finalmente, se devolverá desde la función. Pero si finalmente no hay una palabra de 'retorno', se devolverá el valor del bloque try;
Entonces -finalmente-
return
reescribe el retorno de -intentar-return
.fuente
Hasta donde yo sé, el
finally
bloque siempre se ejecuta, independientemente de si tiene unareturn
declaración dentrotry
o no. Ergo, obtienes el valor devuelto por elreturn
declaración dentro del bloque finalmente.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.
fuente
Voy a dar una respuesta ligeramente diferente aquí: Sí, tanto el bloque
try
yfinally
se ejecutan, yfinally
tiene prioridad sobre el valor de "retorno" real para una función. Sin embargo, estos valores de retorno no siempre se usan en su código.Este es el por qué:
res.send()
de Express.js, que crea una respuesta HTTP y la envía.try
y elfinally
bloque ejecutarán esta función así:Este código mostrará la cadena
try
en su navegador. TAMBIÉN, el ejemplo mostrará un error en su consola. Lares.send()
función se llama dos veces . Esto sucederá con todo lo que sea una función. El bloque try-catch-finalmente ocultará este hecho al ojo inexperto, porque (personalmente) solo asocioreturn
valores con ámbitos de función.En mi humilde opinión, su mejor opción es no usar nunca
return
dentro de unfinally
bloque . Complicará demasiado su código y potencialmente enmascarará errores.De hecho, hay una regla de inspección de código predeterminada configurada en PHPStorm que da una "Advertencia" para esto:
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
Entonces, ¿para qué usas
finally
?Solo lo usaría
finally
para limpiar cosas. Todo lo que no sea crítico para el valor de retorno de una función.Puede tener sentido si lo piensa, porque cuando depende de una línea de código debajo
finally
, está asumiendo que podría haber errores entry
ocatch
. Pero esos dos últimos son los bloques de construcción reales del manejo de errores. Solo usareturn
intry
y en sucatch
lugar.fuente
Referencia: developer.mozilla.org
fuente
Finalmente, se supone que SIEMPRE se ejecuta al final de un bloque try catch, de modo que (por especificación) es la razón por la que obtiene una devolución falsa. Tenga en cuenta que es muy posible que diferentes navegadores tengan diferentes implementaciones.
fuente
¿Qué pasa con esto?
fuente