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 trydevolverlo (es decir, si no arroja un error). No necesito el catchbloque. 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 catcheliminar esos bloques mientras se logra el mismo efecto?
javascript
function
try-catch
return
pimvdb
fuente
fuente

nully 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.asyncfunción, a veces. Ser forzado por el lenguaje javascript a crearcatchbloques 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
catchbloque, 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
trybloqueo. 2. Detecta el error. 3. Ejecuta elfinallybloque. 4. Lanza el error. ¿Es esto correcto?catch). Rodee todo el código con otrotry/catchy podrá detectar elThis WILL get loggederror.No,
catch(ofinally) estryamigo 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
catchbloque 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).returndeclaración detiene cualquier cosa que venga después.returnhará 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
catchtodavía se requiere, es solo la unión que no se requiere ...