La déclaration de capture n'attrape pas d'erreur renvoyée
Pour quelque raison que ce code me donne une exception non interceptée erreur. Il semble que le bloc catch n'est pas la capture de l'erreur. Sont des blocs try catch portée d'une telle manière que je ne peux pas jeter une erreur dans une fonction imbriquée, et ensuite s'attendre à être pris par une instruction catch portée plus haut dans la chaîne? Certaines des données sensibles dans l'application que je suis en train de travailler, en a été retiré, mais il s'attendait à ce que leadInfo[ 0 /1] serait de 32 caractères alpha numériques, chaîne que je tire de paramètres d'URL.
La question sous-jacente ici est à mon appel AJAX en renvoyant une erreur de l'API, et que l'erreur n'est pas manipulé correctement au sein de l'application. D'où la nécessité pour l'instruction throw. L'appel AJAX se termine bien, et retourne un objet JSON qui ne contient pas l'adresse e-mail comme une propriété, donc j'ai besoin de gérer d'une manière qui modifie la page de refléter cela.
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();
}
});
source d'informationauteur Xenology
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle votre
try catch
bloc est défaut est, car une requête ajax est asynchrone. Le try catch bloc à exécuter avant l'appel Ajax et envoyer la demande elle-même, mais l'erreur est renvoyée lorsque le résultat est retourné, AU plus TARD DANS le TEMPS.Lorsque le
try catch
bloc est exécuté, il n'y a pas d'erreur. Lorsque l'erreur est levée, il n'y a pas detry catch
. Si vous avez besoin d'try catch
pour les requêtes ajax, toujours mettre de l'ajaxtry catch
blocs à l'intérieur de lasuccess
rappel, JAMAIS à l'extérieur.Voici comment vous devez le faire:
Le problème est que l'ajax est asynchrone par définition. Votre exception de ne pas obtenir générée à partir de la
$.ajax
fonction, mais à partir de la rappel fonction de la réussite (qui est déclenché à un moment plus tard).Vous devez donner un
error: function(data) {}
paramètre ainsi, afin de gérer les erreurs de réponse du serveur, et en outre, vous devez placer le bloc try/catch à l'intérieur de la fonction de rappel.Si vous avez vraiment envie de l'attraper à l'extérieur de la fonction de rappel, alors vous devriez considérer l'appel d'une fonction plutôt que de lancer une exception, parce que je ne vois pas comment il peut être fait.
En raison de la nature asynchrone des méthodes de rappel en javascript, le contexte de la fonction jeter l'erreur est différent par rapport à celui d'origine. Vous devriez le faire de cette façon:
Je vous suggère de regarder cette excellente l'article sur le (très particulier) contextesfermetures et liaisons en Javascript.