javascript - son - La declaración de captura no captura el error lanzado
prompt javascript ejemplo (3)
Por alguna razón, este código me da un error de excepción no detectada. Parece que el bloque catch no capta el error. ¿Intentan los bloques catch de una forma tal que no pueda arrojar un error en una función anidada, y luego esperen que sea atrapada por una declaración catch situada más arriba en la cadena? Algunos de los datos confidenciales de la aplicación en la que estoy trabajando se han eliminado, pero esperaba que leadInfo [0/1] fuera una cadena alfanumérica de 32 caracteres que extrajera de los parámetros de la URL.
El problema subyacente aquí es que mi llamada AJAX devuelve un error de la API y ese error no se maneja correctamente dentro de la aplicación. De ahí la necesidad de la declaración de tiro. La llamada AJAX completa bien, y devuelve un objeto JSON que no contiene la dirección de correo electrónico como una propiedad, por lo que tengo que manejar eso de una manera que cambie la página para reflejar eso.
jQuery(document).ready(function(){
try {
url = "http://api.com/api/v1/lead/" + leadInfo[1]
jQuery.ajax({
type: ''GET'',
contentType: ''application/json'',
url: url,
dataType : ''jsonp'',
success: function (result) {
result = jQuery.parseJSON(result);
if(!result.data.email){
throw (''New exception'');
}
console.log(result);
jQuery(''.email'').html(result.data.email);
}
});
jQuery(''.surveryButton'').click(function(){
window.location.replace("http://" + pgInventory.host + pgInventory.path + leadInfo[0] + "&curLeadId=" + leadInfo[1] + "&curViewedPages=0");
});
}
catch(err) {
jQuery(''.email'').html(''your e-mail address'');
jQuery(''#arrowContent'').remove();
}
});
Debido a la naturaleza asíncrona de los métodos de devolución de llamada en javascript, el contexto de la función que arroja el error es diferente del original. Deberías hacerlo de esta manera:
success: function (result) {
try {
result = jQuery.parseJSON(result);
if(!result.data.email){
throw (''New exception'');
}
console.log(result);
jQuery(''.email'').html(result.data.email);
}
catch(err) {
// Dealing with the error
}
}
Sugeriría que eche un vistazo a este excelente artículo sobre los contextos (muy particulares), cierres y ataduras en javascrit
El problema es que ajax es asincrónico por definición. Su excepción no se lanza desde la función $.ajax
, sino desde la función de devolución de llamada en caso de éxito (que se activa más adelante).
También debe darle un parámetro error: function(data) {}
, para manejar los errores de respuesta del servidor, y además debe colocar el bloque try / catch dentro de la función de devolución de llamada.
Si realmente desea atraparlo fuera de la devolución de llamada, entonces debería considerar llamar a una función en lugar de lanzar una excepción, porque no veo cómo se puede hacer.
La razón por la cual su bloque try catch
falla es porque una solicitud ajax es asincrónica. El bloque try catch se ejecutará antes de la llamada Ajax y enviará la solicitud, pero el error se produce cuando se devuelve el resultado, AT A POY POINT IN TIME.
Cuando se ejecuta el bloque try catch
, no hay ningún error. Cuando se lanza el error, no hay try catch
. Si necesita try catch
de las solicitudes de ajax, siempre ponga ajax try catch
blocks dentro de la devolución de llamada correcta, NUNCA fuera de ella.
Así es como debes hacerlo:
success: function (result) {
try {
result = jQuery.parseJSON(result);
if (!result.data.email) {
throw (''New exception'');
}
console.log(result);
jQuery(''.email'').html(result.data.email);
} catch (exception) {
console.error("bla");
};
}