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*/
}