Tengo una serie de funciones que devuelven algo o arrojan 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 pasar a la segunda función si la primera función arroja un error.
Entonces, 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 catch
bloque. Sin embargo, el código como try {}
falla porque falta un catch {}
bloque (sin usar) .
Pongo un ejemplo de jsFiddle .
Entonces, ¿hay alguna forma de catch
eliminar esos bloques mientras se logra el mismo efecto?
javascript
function
try-catch
return
pimvdb
fuente
fuente
null
y haces algo comoreturn func1() || func2() || func3();
try {}; finally {}
como se muestra en stackoverflow.com/a/5764505/68210catch (e) {}
, la excepción lanzada porfunc1()
evitaría quefunc2()
se intente.async
función, a veces. Ser forzado por el lenguaje javascript a crearcatch
bloques vacíos es claramente inútil.Un intento sin una cláusula catch envía su error al siguiente catch superior , o la ventana, si no hay ningún catch definido dentro de ese intento.
Si no tiene una captura , una expresión de prueba requiere una cláusula finalmente .
fuente
try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}
?Es posible tener un bloque de captura vacío, sin una variable de error, comenzando con ES2019 . Esto se denomina enlace de captura opcional y se implementó en V8 v6.6, lanzado en junio de 2018 . La función ha estado disponible desde Node 10 , Chrome 66 , Firefox 58 , Opera 53 y Safari 11.1 .
La sintaxis se muestra a continuación:
Aún necesita un
catch
bloque, pero puede estar vacío y no necesita pasar ninguna variable. Si no desea ningún bloque de captura, puede usartry
/finally
, pero tenga en cuenta que no se tragará errores como lo hace una captura vacía.fuente
try
bloqueo. 2. Detecta el error. 3. Ejecuta elfinally
bloque. 4. Lanza el error. ¿Es esto correcto?catch
). Rodee todo el código con otrotry
/catch
y podrá detectar elThis WILL get logged
error.No,
catch
(ofinally
) estry
amigo y siempre está ahí como parte de try / catch .Sin embargo, es perfectamente válido tenerlos vacíos, como en tu ejemplo.
En los comentarios de su código de ejemplo ( si func1 arroja un error, intente con func2 ), parecería que lo que realmente quiere hacer es llamar a la siguiente función dentro del
catch
bloque de la anterior.fuente
try {...}; try {...}
fuera posible, el significado del código podría ser más claro (pruebe el primero, de lo contrario, pruebe el segundo).return
declaración detiene cualquier cosa que venga después.return
hará que la función regrese prematuramente. Actualizaré mi respuesta.try {}; finally {}
como se muestra en stackoverflow.com/a/5764505/68210finally{}
básicamente tiene el mismo espíritu quecatch{}
. Actualizaré la respuesta.No recomendaría intentar finalmente sin la captura, porque si tanto el bloque try como el bloque finalmente lanzan errores, el error arrojado en la cláusula finalmente se multiplica y el error del bloque try se ignora, en mi propia prueba:
Resultado:
fuente
Van juntos en todos los lenguajes que conozco que los tienen (JavaScript, Java, C #, C ++). No lo hagas.
fuente
catch {my code}
Decidí mirar el problema presentado desde un ángulo diferente.
He podido determinar una forma de permitir de cerca el patrón de código solicitado mientras, en parte, abordo el objeto de error no manejado enumerado por otro comentarista.
el código se puede ver en http://jsfiddle.net/Abyssoft/RC7Nw/4/
try: catch se coloca dentro de un bucle for que permite una caída elegante. pudiendo iterar a través de todas las funciones necesarias. cuando se necesita un manejo de errores explícito, se usa una matriz de funciones adicional. en el caso de error y matriz funcional con el elemento de controladores 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 JSLint sea compatible (elimine los espacios iniciales para confirmar), mejore la legibilidad]
fuente
Si solo desea que las funciones 2 y 3 se activen si se produce un error, ¿por qué no las pone en el bloque catch?
fuente
Creo que necesitas usar una función auxiliar como:
y utilícelo como:
fuente
try & catch son como 2 caras de una moneda. así que no es posible sin intentarlo.
fuente
try {}; finally {}
como se muestra en stackoverflow.com/a/5764505/68210Desde ES2019 , puede usarlo fácilmente
try {}
sincatch {}
:Para obtener más información, consulte la propuesta de Michael Ficcara.
fuente
catch
todavía se requiere, es solo la unión que no se requiere ...