如何在 Microsoft Bot Framework 中避免 "Sorry, my bot code is having an issue"
How to avoid "Sorry, my bot code is having an issue" in Microsoft Bot Framework
我有一个在 Azure + Bot Framework + LUIS(通过 LuisDialog)上运行的机器人。
如果用户碰巧连续发送两条消息(在机器人有机会回答之前),他们会在 Facebook Messenger 或网络嵌入中看到此错误消息:
Sorry, my bot code is having an issue.
通过bot通道模拟器调试时,我看到错误是这样的:
"text": "Error: Response status code does not indicate success: 429
(Too Many Requests). at
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task
task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
task)
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);
仍然,用户会看到错误消息 "Sorry, my bot code is having an issue",这基本上意味着存在未处理的异常。
如何防止向用户显示此消息或捕获异常?
消息在PostUnhandledExceptionToUserTask
中发送给用户只是因为异常已经从根对话框A中逃逸。您可以通过防止未处理的异常从根对话框A中逃逸来避免这种情况。
一个选项是添加一个不同的根对话框 B,它只调用您的对话框 A,然后忽略传递给 ResumeAfter<R>
回调的 IAwaitable<R>
结果。
Chain.DefaultIfException
提供对话框 B 的实现。
您可以使用 Bot Framework 的 DefaultIfException
功能在内部处理异常。
看起来像这样:
await Conversation.SendAsync(
activity, () => new Dialogs.RootDialog().DefaultIfException()
);
当您收到 403 或 429 时,可能分别是“超出配额”或“请求过多”,在第一种情况下,您必须重新创建一个密钥并分配给您的 LUIS 应用程序,第一个 1000端点查询是免费的,每个月都会刷新,您必须明智地使用它,否则您必须使用付费层。
对于第二种情况,您也有请求限制,请参阅 Boundaries documentation
在这里你可以找到关于这个的微软documentation。
我有一个在 Azure + Bot Framework + LUIS(通过 LuisDialog)上运行的机器人。
如果用户碰巧连续发送两条消息(在机器人有机会回答之前),他们会在 Facebook Messenger 或网络嵌入中看到此错误消息:
Sorry, my bot code is having an issue.
通过bot通道模拟器调试时,我看到错误是这样的:
"text": "Error: Response status code does not indicate success: 429 (Too Many Requests). at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 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);
仍然,用户会看到错误消息 "Sorry, my bot code is having an issue",这基本上意味着存在未处理的异常。
如何防止向用户显示此消息或捕获异常?
消息在PostUnhandledExceptionToUserTask
中发送给用户只是因为异常已经从根对话框A中逃逸。您可以通过防止未处理的异常从根对话框A中逃逸来避免这种情况。
一个选项是添加一个不同的根对话框 B,它只调用您的对话框 A,然后忽略传递给 ResumeAfter<R>
回调的 IAwaitable<R>
结果。
Chain.DefaultIfException
提供对话框 B 的实现。
您可以使用 Bot Framework 的 DefaultIfException
功能在内部处理异常。
看起来像这样:
await Conversation.SendAsync(
activity, () => new Dialogs.RootDialog().DefaultIfException()
);
当您收到 403 或 429 时,可能分别是“超出配额”或“请求过多”,在第一种情况下,您必须重新创建一个密钥并分配给您的 LUIS 应用程序,第一个 1000端点查询是免费的,每个月都会刷新,您必须明智地使用它,否则您必须使用付费层。
对于第二种情况,您也有请求限制,请参阅 Boundaries documentation
在这里你可以找到关于这个的微软documentation。