25

有什么办法可以捕捉到异常UrlFetchApp.fetch吗?

我以为我可以response.getResponseCode()用来检查响应代码,但我不能,例如当出现 404 错误时,脚本不会继续,只是停在UrlFetchApp.fetch

4

4 回答 4

32

编辑:这个参数现在记录在这里

您可以使用未记录的高级选项“muteHttpExceptions”在返回非 200 状态代码时禁用异常,然后检查响应的状态代码。有关此问题的更多信息和示例可用。

于 2012-07-30T20:32:25.897 回答
28

muteHttpExceptions诀窍是传递UrlFetchApp.fetch().

这是一个示例(未经测试):

var payload = {"value": "key"}
var response = UrlFetchApp.fetch(
            url,
            {
              method: "PUT",
              contentType: "application/json",
              payload: JSON.stringify(payload),
              muteHttpExceptions: true,
            }
          );
var responseCode = response.getResponseCode()
var responseBody = response.getContentText()

if (responseCode === 200) {
  var responseJson = JSON.parse(responseBody)
  // ...
} else {
  Logger.log(Utilities.formatString("Request failed. Expected 200, got %d: %s", responseCode, responseBody))
  // ...
}

出于某种原因,如果 URL 不可用(例如,您尝试使用的服务已关闭),它看起来仍然会引发错误,因此您可能仍需要使用try/catch块。

于 2016-03-02T14:52:24.403 回答
3

为什么不使用 try catch 并处理 catch 块中的错误

try{
    //Your original code, UrlFetch etc
  }
  catch(e){
    // Logger.log(e);
    //Handle error e here 
    // Parse e to get the response code
  }
于 2012-07-30T09:37:07.977 回答
0

您可以手动解析捕获的错误,但不建议这样做。捕获异常时(如果muteHttpExceptions关闭则抛出异常),错误对象将采用以下格式:

{
   "message": "Request failed for ___ returned code___. Truncated server response: {___SERVER_RESPONSE_OBJECT___} (use muteHttpExceptions option to examine full response)",
   "name": "Exception",
   "fileName": "___FILE_NAME___",
   "lineNumber": ___LINE_NUMBER___,
   "stack": "___STACK_DETAILS___"
}

如果您出于某种原因不喜欢使用muteHttpExceptions,则可以捕获异常e,查看e.message“截断服务器响应:”和“(使用 muteHttpExceptions 选项检查完整响应)”之间的文本、JSON.parse() 和返回的对象将是从 api 调用返回的错误。

我不会建议它muteHttpExceptions,只是想展示以这种方式获取错误对象的最佳方法。

无论如何,试着捕捉你的UrlFetchApp.fetch()电话,以确保你捕捉到未处理的异常,比如 404。

于 2020-02-12T09:42:25.410 回答