如何避免"抱歉,我的机器人代码存在问题"在Microsoft Bot Framework中

时间:2016-09-21 07:07:57

标签: c# botframework luis

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

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

  

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

通过bot通道模拟器进行调试时,我发现错误是这样的:

  

" text":"错误:响应状态代码不表示成功: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);

仍然,用户会看到错误消息"抱歉,我的机器人代码出现问题"这基本上意味着有一个未处理的例外。

如何阻止向用户显示此消息或捕获异常?

3 个答案:

答案 0 :(得分:11)

该消息仅在PostUnhandledExceptionToUserTask中发送给用户,因为异常已转义根对话框A.您可以通过阻止未处理的异常转义根对话框A来避免这种情况。

一个选项是添加一个不同的根对话框B,只需调用对话框A,然后忽略传递给IAwaitable<R>回调的ResumeAfter<R>结果。

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

答案 1 :(得分:2)

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

看起来像这样:

await Conversation.SendAsync(
   activity, () => new Dialogs.RootDialog().DefaultIfException()
);

答案 2 :(得分:0)

当您收到403或429时,分别可能是“配额不足”或“请求过多”,在第一种情况下,您必须再次创建密钥并分配给LUIS App,前1000个端点查询是免费的,并且每个月都会刷新一次,您必须明智地使用它,或者必须使用付费层。

对于第二种情况,您对请求也有限制,请参见Boundaries documentation

在这里您可以找到有关此的Microsoft documentation