Как избежать "Извините, мой бот-код имеет проблему" в 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()
);