2016-09-21 21 views
14

Tôi có bot chạy trên Azure + Bot Framework + LUIS (qua LuisDialog).Cách tránh "Xin lỗi, mã bot của tôi đang gặp sự cố" trong Microsoft Bot Framework

Nếu người dùng sẽ xảy ra để gửi hai thông điệp trong một liên tiếp (trước khi bot có một cơ hội để trả lời), họ thấy thông báo lỗi này trên Facebook của họ Messenger hoặc web nhúng:

Sorry, my bot code is having an issue.

Khi gỡ lỗi thông qua bot kênh giả lập, tôi thấy rằng lỗi là thế này:

"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()

sự kết thúc của stack trace cho thấy lỗi có nguồn gốc tại dòng này trong MessageController.cs tôi:

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

Điều này thật kỳ lạ vì tôi đang sử dụng phiên bản trả tiền LUIS cho phép tối đa 10 cuộc gọi mỗi giây.

Trong mọi trường hợp, tôi đã cố gắng gói toàn bộ mã trong MessageController.cs thành một khối try/catch, và trở về giá trị này bất kể một ngoại lệ:

return Request.CreateResponse(HttpStatusCode.OK); 

Tuy nhiên, người dùng thấy thông báo lỗi " Xin lỗi, mã bot của tôi đang gặp sự cố "về cơ bản có nghĩa là có một ngoại lệ không được giải quyết.

Làm cách nào để ngăn không cho hiển thị thông báo này cho người dùng hoặc bắt ngoại lệ?

Trả lời

10

Thông điệp được gửi đến người sử dụng trong PostUnhandledExceptionToUserTask chỉ vì ngoại lệ đã thoát khỏi A. thoại gốc Bạn có thể tránh tình trạng này bằng cách ngăn chặn không được quản lý ngoại lệ thoát hộp thoại gốc A.

Một lựa chọn là thêm một hộp thoại gốc khác B mà chỉ cần gọi hộp thoại của bạn A và sau đó chỉ cần bỏ qua kết quả IAwaitable<R> được chuyển đến cuộc gọi lại ResumeAfter<R>.

Chain.DefaultIfException cung cấp một thực hiện thoại B.

1

Bạn có thể sử dụng chức năng DefaultIfException cho khung bot trong nội bộ xử lý ngoại lệ. Có vẻ như sau:

await Conversation.SendAsync(
    activity,() => new Dialogs.RootDialog().DefaultIfException() 
); 
Các vấn đề liên quan