【问题标题】:Error handling - retry urlfetch on error until success错误处理 - 重试 urlfetch 错误直到成功
【发布时间】:2021-12-13 10:26:04
【问题描述】:

我在这里查看了所有相关问题(例如this),但仍然无法理解这个非常简单的任务。 因此,尝试使用 NumVerify API 验证数字。我们仍在 APILAYER 上使用免费许可证,因此我们不时会收到以下错误

https://apilayer.net 请求失败,返回代码 500

我想添加一个循环,以便脚本再次尝试,直到收到正确的响应。 这是基于这里的几个答案的sn-p:

function numverifylookup(mobilephone) {
    console.log("input number: ",mobilephone);
    var lookupUrl = "https://apilayer.net/api/validate?access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&number="+mobilephone+"&country_code=IL";
    try {
    var response = UrlFetchApp.fetch(lookupUrl);
    if (response) {//Check for truthy value
     var json = response.getContentText();
    } else {
    Utilities.sleep(2000);
    continue;//If "get" returned a falsy value then continue
  }
} catch(e) {
  continue;//If error continue looping
}
    var data = JSON.parse(response);

很遗憾,由于以下错误,仍然无法正常工作:

Continue 必须在循环内。 (第 10 行

有什么想法吗? 我认为使用 muteHTTPexepctions 解决这个问题实际上更好,但不能让它发挥作用。 谢谢!

【问题讨论】:

    标签: google-apps-script error-handling runtime-error urlfetch


    【解决方案1】:

    我想我可以按以下方式工作:

    function numverify(mobilephone);
    console.log("input number: ",mobilephone);
        var lookupUrl = "https://apilayer.net/api/validate?access_key=XXXXXXXXXXXX&number="+mobilephone+"&country_code=IL";
        var i = 0;
        var trycount = 1;
        var errorcodes = "";
        while (i != 1) {
        var response = UrlFetchApp.fetch(lookupUrl, {muteHttpExceptions: true });
        var responsecode = response.getResponseCode();
        var errorcodes = errorcodes + "," + responsecode;
        if (responsecode = 200) {//Check for truthy value
          var json = response.getContentText();
          var i = 1
        } else {
          var trycount = trycount + 1;
          Utilities.sleep(2000);
         }
      } 
        var data = JSON.parse(response);
        var valid = data.valid;
        var localnum = data.local_format;
        var linetype = data.line_type;
        console.log(data," ",valid," ",localnum," ",linetype," number of tries= ",trycount," responsecodes= ", errorcodes);
        var answer = [valid,localnum,linetype];
        return answer;
    }

    如果它仍然不起作用,我会回过头来。 感谢您的帮助!

    【讨论】:

      【解决方案2】:

      您不能使用continue 来实现您想要的,而是可以/需要再次调用该函数:

      function numverifylookup(mobilephone) {
        console.log("input number: ", mobilephone);
        var lookupUrl = "https://apilayer.net/api/validate?access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&number=" + mobilephone + "&country_code=IL";
        try {
          var response = UrlFetchApp.fetch(lookupUrl);
          if (response) {//Check for truthy value
            var json = response.getContentText();
          } else {
            Utilities.sleep(2000);
            numverifylookup(mobilephone);
          }
        } catch (e) {
          Utilities.sleep(2000);
          numverifylookup(mobilephone);//If error rerun the function
        }
        var data = JSON.parse(response);
      }
      

      正如您可以从documentation 中得出的,声明continue 只能在循环内部使用,例如for 循环。

      【讨论】:

      • 谢谢ziganotschka。但是,得到相同的错误:(
      • 抱歉,我忘记从您的代码中删除第二个 continue 了。
      • 谢谢。原谅我是新手,但这不会导致死循环吗?
      • 它将循环直到收到响应 - 正如您指定的那样。如果您从未得到响应 - 它可能确实会无休止地运行。您可以实现一个计数器变量以在运行一定数量后停止。
      • 我看到您提供了一个带有循环的替代方法的答案 - 这当然是一个很好的解决方案!
      猜你喜欢
      • 2012-02-12
      • 2023-03-06
      • 2020-06-11
      • 2013-11-15
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多