首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以捕获JavaScript异步回调中抛出的异常吗?

可以捕获JavaScript异步回调中抛出的异常吗?
EN

Stack Overflow用户
提问于 2010-09-09 22:57:29
回答 7查看 32.5K关注 0票数 70

有没有办法在JavaScript回调中捕获异常?这有可能吗?

代码语言:javascript
复制
Uncaught Error: Invalid value for property <address>

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

代码语言:javascript
复制
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);
}​
EN

回答 7

Stack Overflow用户

发布于 2010-09-09 23:39:36

它不会捕获示例中的任何内容的原因是,一旦调用了geocode()回调,try/catch块就结束了。因此,geocode()回调是在try块的作用域之外执行的,因此不能被它捕获。

据我所知,在JavaScript回调中捕获抛出的异常是不可能的(至少,不可能以任何简单的方式)。

票数 77
EN

Stack Overflow用户

发布于 2013-06-23 03:06:38

可以,您可以覆盖window.onerror的默认行为

代码语言:javascript
复制
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; 
};
票数 42
EN

Stack Overflow用户

发布于 2012-03-06 04:47:30

您确实可以捕获在JavaScript回调函数中触发的异常。

关键是在回调代码中设置try/catch块,因为回调代码外部的任何try/catch块在回调代码执行时都已经退出。因此,虽然上面的try/catch块不能捕获调用回调函数时抛出的任何异常,但您仍然可以这样做:

代码语言:javascript
复制
// 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!");
      }
   }
);

当抛出异常时,您将能够捕获该异常。我不能百分之百确定是否会出现这种情况,所以我写了一些测试代码来验证。在Chrome 19.0.1055.1开发版本中,该异常被捕获。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3677783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档