Est-il possible d'attraper les exceptions levées dans un JavaScript asynchrone de rappel?
Est-il un moyen d'intercepter des exceptions en JavaScript rappels? Est-il même possible?
Uncaught Error: Invalid value for property <address>
Voici le jsfiddle: http://jsfiddle.net/kjy112/yQhhy/
try {
//this will cause an exception in google.maps.Geocoder().geocode()
//since it expects a string.
var zipcode = 30045;
var map = new google.maps.Map(document.getElementById('map_canvas'), {
zoom: 5,
center: new google.maps.LatLng(35.137879, -82.836914),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
//exception in callback:
var geo = new google.maps.Geocoder().geocode({ 'address': zipcode },
function(geoResult, geoStatus) {
if (geoStatus != google.maps.GeocoderStatus.OK) console.log(geoStatus);
}
);
} catch (e) {
if(e instanceof TypeError)
alert('TypeError');
else
alert(e);
}
Vous devez vous connecter pour publier un commentaire.
La raison qu'il ne sera pas attraper quoi que ce soit dans votre exemple, car une fois que le
geocode()
callback est appelée, letry/catch
bloc est terminé. Par conséquent, lageocode()
de rappel est exécuté en dehors de la portée de latry
bloquer et donc pas catchable par elle.Autant que je sache, il n'est pas possible d'intercepter les exceptions levées en JavaScript rappels (au moins, pas de manière simple).
Oui, vous pouvez remplacer le comportement par défaut de de la fenêtre.onerror:
En effet, vous pouvez intercepter les exceptions que l'incendie à l'intérieur d'un script JavaScript fonction de rappel.
La clé est de mettre en place le
try/catch
bloc dans le rappel de code, comme touttry/catch
blocs à l'extérieur de la fonction de rappel du code aura déjà quitté à la fois le rappel de code est exécuté. Donc, même si votretry/catch
bloc ci-dessus ne sera pas en mesure d'intercepter toutes les exceptions qui jettent lorsque la fonction de rappel est appelée, vous pouvez toujours faire quelque chose comme ceci:et vous serez capable de capturer l'exception quand il est jeté. Je n'étais pas sûr à 100% si c'est le cas ou pas, donc j'ai écrit certains de code de test pour vérifier. L'exception est capturée comme prévu sur Chrome 19.0.1055.1 dev.
a.b.c.f()
fonction dans le thread asynchrone. En d'autres termes, votre rappel n'a même pas appelé car il y a une erreur avant de votre rappel. Cette réponse si l'opérateur décide de transférer cette erreur à votre fonction de rappel lorsque votre fonction de rappel coopère par l'appel de la mise en œuvre d'une fonction qui permettrait de jeter l'erreur à votre fonction de rappel.J'ai détecté l'erreur par monkey patching les journaux de la console.
Voici ma démarche:
Selon toutes les réponses, try/catch + fonction de rappel est définie sur un contexte différent mais alors comment expliquez-vous ce code try/catch de travail?
setTimeout()
), il échouera. jsbin.com/vobokuriwu/edit?html,js,console,sortie