20

我有一个在 Azure + Bot Framework + LUIS 上运行的机器人(通过 LuisDialog)。

如果用户碰巧连续快速发送两条消息(在机器人有机会回答之前),他们会在 Facebook Messenger 或网络嵌入中看到以下错误消息:

抱歉,我的机器人代码有问题。

通过机器人通道模拟器调试时,我看到错误是这样的:

“文本”:“错误:响应状态代码不指示成功:429(请求过多)。在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) Microsoft.Bot.Builder.Luis.LuisService.d__4.MoveNext()

堆栈跟踪的末尾显示错误源自我的 MessageController.cs 中的这一行:

await Conversation.SendAsync(activity, () => new LuisRootDialogEnglish());

这很奇怪,因为我使用的是付费版本的 LUIS,每秒最多允许 10 个调用。

无论如何,我尝试将 MessageController.cs 中的整个代码包装到一个try/catch块中,并返回这个值而不考虑异常:

return Request.CreateResponse(HttpStatusCode.OK);

尽管如此,用户仍会看到错误消息“对不起,我的机器人代码有问题”,这基本上意味着存在未处理的异常。

如何防止此消息显示给用户,或捕获异常?

4

3 回答 3

14

消息发送给用户PostUnhandledExceptionToUserTask只是因为异常已经逃脱了根对话 A。您可以通过防止未处理的异常逃脱根对话 A 来避免这种情况。

一种选择是添加一个不同的根对话框 B,它只调用您的对话框 A,然后简单地忽略IAwaitable<R>传递给ResumeAfter<R>回调的结果。

Chain.DefaultIfException提供对话框 B 的实现。

于 2016-09-28T17:27:29.237 回答
2

您可以使用DefaultIfExceptionBot Framework 的功能在内部处理异常。

它看起来像这样:

await Conversation.SendAsync(
   activity, () => new Dialogs.RootDialog().DefaultIfException()
);
于 2017-08-30T12:58:57.693 回答
0

当您收到 403 或 429 时,可能分别是“超出配额”或“请求过多”,在第一种情况下,您必须再次创建密钥并分配给您的 LUIS 应用程序,前 1000 个端点查询是免费的,并且它将每月更新一次,您必须明智地使用它,否则您必须使用付费层。

对于第二种情况,您对请求也有限制,请参阅边界文档

在这里,您可以找到有关此的 Microsoft文档

于 2019-03-21T21:04:03.740 回答