tutor onlinegdb online compiler coding javascript try-catch

javascript - onlinegdb - python tutor online



Javascript intente... atrapar... otra cosa... finalmente como Python, Java, Ruby, etc. (4)

¿Cómo puede Javascript duplicar el modelo de ejecución de cuatro partes try - catch - else - finally que es compatible con otros idiomas?

Un resumen breve y claro es de Python 2.5 novedades . En términos de Javascript:

// XXX THIS EXAMPLE IS A SYNTAX ERROR try { // Protected-block } catch(e) { // Handler-block } else { // Else-block } finally { // Final-block }

Se ejecuta el código en bloque protegido . Si el código lanza una excepción, se ejecuta Handler-block ; Si no se lanza ninguna excepción, se ejecuta Else-block .

Independientemente de lo que haya ocurrido anteriormente, Final-block se ejecuta una vez que se completa el bloqueo del código y se manejan las excepciones lanzadas. Incluso si hay un error en Handler-block o Else-block y se genera una nueva excepción, el código en Final-block todavía se ejecuta.

Tenga en cuenta que cortar el bloque Else y pegar al final del bloque protegido es incorrecto . Si ocurre un error en Else-block , Handler-block no debe manejarlo.


Extendiendo un poco la idea de jhs, todo el concepto podría incluirse dentro de una función, para proporcionar aún más legibilidad:

var try_catch_else_finally = function(protected_code, handler_code, else_code, finally_code) { try { var success = true; try { protected_code(); } catch(e) { success = false; handler_code({"exception_was": e}); } if(success) { else_code(); } } finally { finally_code(); } };

Entonces podemos usarlo de esta manera (muy similar a la forma de Python):

try_catch_else_finally(function() { // protected block }, function() { // handler block }, function() { // else block }, function() { // final-block });


Javascript no tiene la sintaxis para soportar el escenario sin excepción. La mejor solución es las declaraciones de try anidadas, similares a la técnica "heredada" de PEP 341

// A pretty-good try/catch/else/finally implementation. try { var success = true; try { protected_code(); } catch(e) { success = false; handler_code({"exception_was": e}); } if(success) { else_code(); } } finally { this_always_runs(); }

Además de la legibilidad, el único problema es la variable de success . Si protected_code establece window.success = false , esto no funcionará. Una forma menos legible pero más segura utiliza un espacio de nombres de función:

// A try/catch/else/finally implementation without changing variable bindings. try { (function() { var success = true; try { protected_code(); } catch(e) { success = false; handler_code({"exception_was": e}); } if(success) { else_code(); } })(); } finally { this_always_runs(); }


Sé que esto es antiguo, pero aquí hay una solución de sintaxis pura , que creo que es la forma correcta de hacerlo:

try { // Protected-block try { // Else-block } catch (e) { // Else-handler-block } } catch(e) { // Handler-block } finally { // Final-block }

Se ejecuta el código en bloque protegido . Si el código arroja un error, se ejecuta Handler-block ; Si no se produce ningún error, se ejecuta el bloque Else .

No importa lo que haya sucedido anteriormente, Final-block se ejecuta una vez que el bloque de código está completo y se manejan los errores lanzados. Incluso si hay un error en Handler-block o Else-block , el código en Final-block todavía se ejecuta.

Si se lanza un error en el bloque Else, no es manejado por el bloque Handler sino por el bloque Else-handler.

Y si sabes que el Else-block no tirará:

try { // Protected-block // Else-block } catch(e) { // Handler-block } finally { // Final-block }

Moraleja de la historia, no tengas miedo de sangrar;)


Sé que la pregunta es antigua y ya se han dado respuestas, pero creo que mi respuesta es la más sencilla de obtener un "else" en javascripts try-catch-block.

var error = null; try { /*Protected-block*/ } catch ( catchedError ) { error = catchedError; //necessary to make it available in finally-block } finally { if ( error ) { /*Handler-block*/ /*e.g. console.log( ''error: '' + error.message );*/ } else { /*Else-block*/ } /*Final-block*/ }