Búsqueda de sitios web

función - ¿Es posible try {} sin catch {} en JavaScript?


Tengo varias funciones que o bien devuelven algo o generan un error. En una función principal, llamo a cada una de estas, y me gustaría devolver el valor que cada función retorna, o pasar a la segunda función si la primera función genera un error.

Así que básicamente lo que tengo actualmente es:

function testAll() {
    try { return func1(); } catch(e) {}
    try { return func2(); } catch(e) {} // If func1 throws error, try func2
    try { return func3(); } catch(e) {} // If func2 throws error, try func3
}

Pero en realidad me gustaría solo intentar devolverlo (es decir, si no lanza un error). No necesito el bloque catch. Sin embargo, código como try {} falla porque le falta un bloque catch {} (no usado).

Puse un ejemplo en jsFiddle.

Entonces, ¿hay alguna manera de eliminar esos bloques catch mientras se logra el mismo efecto?

Respuesta #1

Un try sin una cláusula catch envía su error al siguiente catch superior, o a la ventana, si no hay ningún catch definido dentro de ese try.

Si no tienes un catch, una expresión try requiere una cláusula finally.

try {
    // whatever;
} finally {
    // always runs
}

Respuesta #2

Es posible tener un bloque catch vacío, sin una variable de error, a partir de ES2019. Esto se llama enlace catch opcional y fue implementado en V8 v6.6, lanzado en junio de 2018. La característica ha estado disponible desde Node 10, Chrome 66, Firefox 58, Opera 53 y Safari 11.1.

La sintaxis se muestra a continuación:

try {
  throw new Error("This won't show anything");
} catch { };

Todavía necesitas un bloque catch, pero puede estar vacío y no necesitas pasar ninguna variable. Si no quieres un bloque catch en absoluto, puedes usar try/finally, pero ten en cuenta que no suprimirá los errores como lo hace un catch vacío.

try {
  throw new Error("This WILL get logged");
} finally {
  console.log("This syntax does not swallow errors");
}

Respuesta #3

No, catch (o finally) es amigo de try y siempre está presente como parte de try/catch.

Sin embargo, es perfectamente válido tenerlos vacíos, como en tu ejemplo.

En los comentarios de tu código de ejemplo (Si func1 lanza un error, prueba func2), parecería que lo que realmente quieres hacer es llamar a la siguiente función dentro del bloque catch de la anterior.

Respuesta #4

No recomendaría try-finally sin el catch, porque si tanto el bloque try como el bloque finally lanzan errores, el error lanzado en la cláusula finally se propaga y se ignora el error del bloque try, en mi propia prueba:

try {
  console.log('about to error, guys!');
  throw new Error('eat me!');
} finally {
  console.log ('finally, who cares');
  throw new Error('finally error');
}

Resultado :

>     about to error, guys!
>     finally, who cares
>     .../error.js:9
>         throw new Error('finally error');
>         ^
>     
>     Error: finally error

Artículos relacionados