try {} sin catch {} posible en JavaScript?


Tengo una serie de funciones que devuelven algo o lanzan un error. En una función principal, llamo a cada uno de estos, y me gustaría devolver el valor devuelto por cada función, o ir a la segunda función si las primeras funciones arroja 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 try devolverlo (es decir, si no arroja un error). No necesito el bloque catch. Sin embargo, código como try {} falla porque es falta un bloque catch {} (no utilizado).

Puse un ejemplo en jsFiddle.

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

Author: pimvdb, 2011-04-23

7 answers

No. Tienes que quedártelas.

Esto realmente tiene sentido ya que los errores no deben ser ignorados silenciosamente en absoluto.

 22
Author: ThiefMaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-23 12:19:03

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

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

try {
    // whatever;
} finally {
    // always runs
}
 150
Author: kennebec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-11 02:57:10

No, catch (o finally) es el amigo de try y siempre está allí 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.

 10
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-23 01:52:00

Van juntos en todos los lenguajes que conozco que los tiene (JavaScript, Java, C#, C++). No lo hagas.

 2
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-23 12:20:43

He decidido mirar el problema presentado desde un ángulo diferente.

He sido capaz de determinar una manera de permitir de cerca para el patrón de código solicitado, mientras que en parte abordar el objeto de error no manejado enumerado por otro comentarista.

El código se puede ver @ http://jsfiddle.net/Abyssoft/RC7Nw/4 /

Try: catch se coloca dentro de un bucle for permitiendo una caída agraciada. mientras que ser capaz de iterar a través de todas las funciones necesarias. cuando error explícito el manejo es necesario se utiliza una matriz de funciones adicionales. en el par de error y matriz funcional con el elemento manejadores de error no es una función, el error se descarga a la consola.

Según los requisitos de stackoverflow, aquí está el código en línea [editado para que sea compatible con JSLint (elimine los espacios iniciales para confirmar), mejore la legibilidad]

function func1() {"use strict"; throw "I don't return anything"; }
function func2() {"use strict"; return 123; }
function func3() {"use strict"; throw "I don't return anything"; }

// ctr = Code to Run <array>, values = values <array>, 
// eh = error code can be blank.
// ctr and params should match 1 <-> 1
// Data validation not done here simple POC
function testAll(ctr, values, eh) {
    "use strict";
    var cb; // cb = code block counter
    for (cb in ctr) {
        if (ctr.hasOwnProperty(cb)) {
            try {
                return ctr[cb](values[cb]);
            } catch (e) {
                if (typeof eh[cb] === "function") {
                    eh[cb](e);
                } else {
                    //error intentionally/accidentially ignored
                    console.log(e);
                }
            }
        }
    }
    return false;
}

window.alert(testAll([func1, func2, func3], [], []));

 2
Author: user1800957,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-05 18:36:31

No recomendaría try-finally sin el catch, porque si tanto el bloque try como el bloque finally throw fallan, el error lanzado en la cláusula finally se burbujea y el error del bloque try se ignora, 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
 1
Author: Joe B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 20:40:37

Try & catch son como 2 caras de una moneda. así que no es posible sin intentarlo.

 0
Author: Hitesh Prajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-23 13:02:44