当“很抱歉,发生服务器错误。请稍候,然后重试”时如何避免 DEADLINE_EXCEEDED。发生?

Posted

技术标签:

【中文标题】当“很抱歉,发生服务器错误。请稍候,然后重试”时如何避免 DEADLINE_EXCEEDED。发生?【英文标题】:How to avoid DEADLINE_EXCEEDED when "We're sorry, a server error occurred. Please wait a bit and try again." happens? 【发布时间】:2021-03-14 04:55:51 【问题描述】:

我读过类似的问题,例如Error type of "We're sorry, a server error occurred. Please wait a bit and try again. " 和许多其他问题,但它们是针对其他类型的错误。


我有一个使用分钟计时器运行和处理 Gmail 电子邮件的 Google Apps 脚本。

每天我都会通过We're sorry, a server error occurred. Please wait a bit and try again. 的电子邮件收到日志(见下面的截图#1)。问题是:

没有报错所在的行,所以很难调试

它时不时地随机发生,即使在这个精确的时间没有发生任何事情(没有要处理的电子邮件),而且在 99.9% 的时间里,一切都正常工作,没有错误。当没有要处理的电子邮件时,我看不出为什么这段代码会失败:

  var mylabel = GmailApp.getUserLabelByName('emailstoprocess'); 
  var threads = mylabel.getThreads();
  for (var i = 0; i < threads.length; i++) 
      // do something
  

在我的脚本中,我不调用任何外部 API,只调用 Gmail API,并且没有耗时的循环(尤其是当没有新电子邮件时:脚本应该什么都不做)。我怎样才能控制这个DEADLINE_EXCEEDED 错误(见下面的截图#2)?确实在仪表板中,Executions 页面,我看到:We're sorry, a server error occurred: DEADLINE_EXCEEDED

即使我的脚本在失败时什么也没做,如何避免这个DEADLINE_EXCEEDED 错误? 或者至少如何避免每天收到关于此的通知?

【问题讨论】:

点击Unknown右边的3个点,是报错还是显示触发? 虽然我不确定do something的细节,从When there is no email to process, I can't see why this code can fail:,如果threads的长度为0时出现错误,例如if (threads.length == 0) return;时放在var threads = mylabel.getThreads();之后,你会得到什么结果? @JoseVasquez 我尝试点击这 3 个点,但没有提供更多信息。这是一个基于时间的触发器(每分钟),它在 99.9% 的时间内都可以正常工作。就好像他们的服务器一天有几次卡顿,然后执行就延迟了…… 【参考方案1】:

回答

我可以看到这是您使用 V8 运行时时发生的特定错误。鉴于提供的信息,您可以使用 Rhino Runtime 避免这些错误。这不是理想的解决方法,但没有更多信息可调试。

更改为 Rhino 运行时

编辑您的manifest fileappscript.json(如果您使用的是新的脚本编辑器,请转到项目设置> 标记在编辑器中显示“appsscript.json”清单文件)并更改 runtimeVersion 改为 STABLEDEPRECATED_ES5,意思是“把它改成 Rhino”。

如果错误仍然存​​在

在这种情况下,这可能是 Google Apps 脚本中的问题,您应该按照建议将其发布到 Google Issue Tracker。

参考

Manifests

Manifest structure

【讨论】:

以上是关于当“很抱歉,发生服务器错误。请稍候,然后重试”时如何避免 DEADLINE_EXCEEDED。发生?的主要内容,如果未能解决你的问题,请参考以下文章

当 UI 允许新对象时如何处理取消

当应用程序不在后台运行时如何处理推送通知

当 ListView 有 ItemTemplate 时如何处理 ListViewItem 的右键单击?

当“try .. except IOError”未捕获时如何处理 FileNotFoundError?

JWT:当用户打开新标签时如何处理 GET 请求?

JWT:当用户打开新标签时如何处理 GET 请求?