Как избежать "Извините, мой бот-код имеет проблему" в Microsoft Bot Framework

У меня есть бот, который работает на Azure + Bot Framework + LUIS (через LuisDialog).

Если пользователь отправляет два сообщения в короткие последовательности (до того, как бот имеет возможность ответить), они видят это сообщение об ошибке в своем Facebook Messenger или веб-встраивании:

Извините, у моего бот-кода возникла проблема.

При отладке через эмулятор бот-канала я вижу, что ошибка такова:

"текст": "Ошибка: код состояния ответа не указывает на успех: 429 (Слишком много запросов). в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task задача)   в 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);

Тем не менее, пользователи видят сообщение об ошибке "Извините, мой бот-код имеет проблему", что в основном означает, что существует необработанное исключение.

Как я могу препятствовать тому, чтобы это сообщение показывалось пользователям, или улавливало исключение?

Ответы

Ответ 1

Сообщение отправляется пользователю в PostUnhandledExceptionToUserTask только потому, что исключение прошло из корневого диалога A. Вы можете избежать этой ситуации, предотвратив исключение необработанных исключений из корневого диалога A.

Один из вариантов заключается в добавлении другого корневого диалога B, который просто вызывает ваше диалоговое окно A, а затем просто игнорирует результат IAwaitable<R>, который передается обратному сообщению ResumeAfter<R>.

Chain.DefaultIfException обеспечивает реализацию диалога B.

Ответ 2

Вы можете использовать функциональность DefaultIfException для рамки bot для внутренней обработки исключения. Это выглядит так:

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