当前位置: 首页 > 知识库问答 >
问题:

catch语句不捕获抛出的错误

萧嘉禧
2023-03-14

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

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

共有3个答案

微生嘉
2023-03-14

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

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

如果你真的想在回调之外抓住它,那么你应该考虑调用一个函数而不是抛出一个异常,因为我看不出它是如何做到的。

堵鸿光
2023-03-14

由于 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中(非常特殊的)上下文、闭包和绑定的优秀文章。

段干博涉
2023-03-14

您的< code>try catch块失败的原因是因为ajax请求是异步的。try catch块将在Ajax调用之前执行,并发送请求本身,但是在稍后返回结果时会抛出错误。

执行<code>try-catch<code>块时,没有错误。当抛出错误时,没有<code>try-catch</code>。如果您需要<code>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");
    };
}
 类似资料:
  • 我开始在javascript对象中添加错误处理,这些对象通常使用jQuery。我的问题是,当我从jQuery方法中抛出新错误时-它不会被包装jQuery调用的catch语句捕获-它只是抛出标准错误,但不会作为日志消息登录到控制台。下面是一个例子: 当我用try/catch包装回调函数的内容时,它就可以工作了: 有什么想法可以简化它,为什么会这样?

  • 问题内容: 我在让Chai的node.js应用程序进行测试时遇到问题。测试会因引发的错误而不断失败,但是如果我将测试用例包装在try和catch中并断言所捕获的错误,它将起作用。 难道不喜欢的工作,我认为它应该还是什么? 失败: 问题答案: 您必须将一个函数传递给。像这样: 执行此操作的方式将传递给call 的 结果。但是要测试是否抛出了某些东西,您必须将一个函数传递给,该函数会自行调用。上面使用

  • Scala没有检查异常。但是,当从java调用scala代码时,希望捕获scala抛出的异常。 斯卡拉: Java:

  • 在我的Node.js应用程序的测试中,让Chai的 工作时遇到了问题。测试在抛出的错误上不断失败,但是如果我将测试用例包装在try和catch中,并在捕获的错误上断言,它就会工作。 不像我认为的那样工作吗? 失败:

  • 请求(正文)

  • 有什么办法可以做到这一点吗? 我想我可以使用scanner来代替它,但是我只是好奇是否有办法在捕获异常后重复try语句。