57

出于某种原因,这段代码给了我一个未捕获的异常错误。似乎 catch 块没有捕获错误。try catch 块的作用域是不是我不能在嵌套函数中抛出错误,然后期望它被作用域更高的 catch 语句捕获?我正在使用的应用程序中的一些敏感数据已被删除,但它预计leadInfo [0 / 1] 将是我从URL 参数中提取的32 个字符的字母数字字符串。

这里的根本问题是我的 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();
        }
});
4

3 回答 3

108

您的try catch块失败的原因是 ajax 请求是异步的。try catch 块将在 Ajax 调用之前执行并自己发送请求,但是当返回结果时会抛出错误,在稍后的时间点。

执行块时try catch,没有错误。抛出错误时,没有try catch. 如果您需要try catchajax 请求,请始终将 ajaxtry catch块放在success回调中,切勿在回调之外。

这是你应该如何做的:

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");
    };
}
于 2013-05-01T10:58:09.263 回答
5

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

我建议你看看这篇关于Javascript中(非常特殊的)上下文闭包绑定的优秀文章。

于 2013-05-01T11:02:33.087 回答
1

问题是 ajax 根据定义是异步的。您的异常不是从$.ajax函数内部引发的,而是从成功时的回调函数(稍后触发)引发的。

您还应该给error: function(data) {}它一个参数,以处理服务器响应错误,此外,您应该将 try/catch 块放在回调函数中。

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

于 2013-05-01T10:59:14.417 回答