2013-05-01 100 views
15

由于某些原因,此代码给了我一个未捕获的异常错误。看起来catch块没有捕捉到错误。是否尝试将catch块的作用域限制为我不能在嵌套函数中抛出错误,然后期望它被作用域更高的catch语句捕获?我正在使用的应用程序中的一些敏感数据已被删除,但它预期leadInfo [0/1]将是我从URL参数中提取的32个字符的字母数字字符串。Catch语句不会抛出错误

这里的底层问题是我的AJAX调用从API返回一个错误,并且错误在应用程序中没有正确处理。因此需要throw语句。 AJAX调用完成正常,并返回一个不包含电子邮件地址的JSON对象作为属性,所以我需要以改变页面的方式来处理它以反映这一点。

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(); 
     } 
}); 

回答

35

try catch块失败的原因是因为ajax请求是异步的。 try catch块将在Ajax调用之前执行,并自己发送请求,但返回结果时会引发错误,AT A LATER POINT IN TIME。

try catch块被执行时,没有错误。发生错误时,不存在try catch。如果您需要try catch来处理Ajax请求,请始终在success回调内部放置ajax try catch块,永远不要在其外面。

这里是你应该怎么做:

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"); 
    }; 
} 
+0

它看起来像我对JSONP的调用稍微有所了解。我的印象是JSONP调用总是被迫为同步的,结果恰恰相反,它们总是被迫为异步的。现在这些信息已经解决了,这是完全合理的。谢谢你的快速反应! – Xenology 2013-05-01 11:05:54

1

的问题是,AJAX是通过定义异步的。您的异常不会从$.ajax函数中抛出,而是从成功(稍后触发)的回调函数中抛出。

你应该给一个error: function(data) {}参数,它为好,处理服务器响应的错误,而且你应该把try/catch块回调函数。

如果你真的想在回调之外捕获它,那么你应该考虑调用一个函数而不是抛出一个异常,因为我不知道它是如何完成的。

1

由于javascript中回调方法的异步性质,抛出错误的函数的上下文与原始的不同。你应该做的是这样的:

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 
    } 
} 

我建议你看看这个优秀article有关(很特别)上下文关闭绑定在javascrit