是否有可能捕获JavaScriptasynchronouscallback中引发的exception?

有没有办法在JavaScriptcallback中捕获exception? 这甚至有可能吗?

Uncaught Error: Invalid value for property <address> 

这里是jsfiddle: http : //jsfiddle.net/kjy112/yQhhy/

 try { // this will cause an exception ing 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); }​ 

在你的例子中不会捕捉任何东西的原因是因为一旦调用了geocode()callback, try/catch块就结束了。 因此, geocode()callback在try块的范围之外执行,因此不能被其捕获。

据我所知,不可能捕获JavaScriptcallback中抛出的exception(至less不是直接的)。

是的,你可以覆盖window.onerror的默认行为:

 window.onerror = function(message, file, lineNumber) { // all errors will be caught here // you can use `message` to make sure it's the error you're looking for // returning true overrides the default window behaviour return true; }; 

您确实可以捕获在JavaScriptcallback函数中触发的exception。

关键是在callback代码中设置try/catch块,因为callback代码之外的任何try/catch块在执行callback代码时已经退出。 所以尽pipe上面的try/catch块不能捕获在调用callback函数时抛出的任何exception,但仍然可以这样做:

 // this will cause an exception ing 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) { try { if (geoStatus != google.maps.GeocoderStatus.OK) console.log(geoStatus); } catch(e){ alert("Callback Exception caught!"); } } ); 

当抛出exception时你将能够捕获exception。 我不是100%确定这是否是这样,所以我写了一些testing代码来validation。 在Chrome 19.0.1055.1 dev中,按预期捕获到该exception。

我已经通过修补控制台日志来检测到错误。

 if(window.console && console.error){ var old = console.error; console.error = function(){ if(arguments[0].indexOf('Google Maps API error')!=-1){ alert('Bad Google API Key '+ arguments[0]); } Array.prototype.unshift.call(arguments); old.apply(this, arguments); } } 

这是我的方法:

 // the purpose of this wrapper is to ensure that any // uncaught exceptions after a setTimeout still get caught function callbackWrapper(func) { return function() { try { func(); } catch (err) { // callback will reach here :) // do appropriate error handling console.log("error"); } } } try { setTimeout(callbackWrapper(function() {throw "ERROR";}), 1000); } catch (err) { // callback will never reach here :( }