// This method is called by any waterfall step that throws a SkillException to ensure consistency protected async Task HandleDialogExceptions(WaterfallStepContext sc, SkillException ex) { // send trace back to emulator var trace = new Activity(type: ActivityTypes.Trace, text: $"DialogException: {ex.Message}, StackTrace: {ex.StackTrace}"); await sc.Context.SendActivityAsync(trace); // log exception TelemetryClient.TrackException(ex, new Dictionary <string, string> { { nameof(sc.ActiveDialog), sc.ActiveDialog?.Id } }); // send error message to bot user if (ex.ExceptionType == SkillExceptionType.APIAccessDenied) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(ToDoSharedResponses.ToDoErrorMessageBotProblem)); } else if (ex.ExceptionType == SkillExceptionType.AccountNotActivated) { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(ToDoSharedResponses.ToDoErrorMessageAccountProblem)); } else { await sc.Context.SendActivityAsync(ResponseManager.GetResponse(ToDoSharedResponses.ToDoErrorMessage)); } // clear state var state = await ToDoStateAccessor.GetAsync(sc.Context); state.Clear(); }
// This method is called by any waterfall step that throws a SkillException to ensure consistency protected async Task HandleDialogExceptions(WaterfallStepContext sc, SkillException ex) { // send trace back to emulator var trace = new Activity(type: ActivityTypes.Trace, text: $"DialogException: {ex.Message}, StackTrace: {ex.StackTrace}"); await sc.Context.SendActivityAsync(trace); // log exception if (Services.TelemetryClient != null) { Services.TelemetryClient.TrackException(ex, AssembleTelemetryData(sc)); } // send error message to bot user if (ex.ExceptionType == SkillExceptionType.APIAccessDenied) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(CalendarSharedResponses.CalendarErrorMessageBotProblem)); } else { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(CalendarSharedResponses.CalendarErrorMessage)); } // clear state var state = await Accessor.GetAsync(sc.Context); state.Clear(); }
// This method is called by any waterfall step that throws a SkillException to ensure consistency protected async Task HandleDialogExceptions(WaterfallStepContext sc, SkillException ex) { // send trace back to emulator var trace = new Activity(type: ActivityTypes.Trace, text: $"DialogException: {ex.Message}, StackTrace: {ex.StackTrace}"); await sc.Context.SendActivityAsync(trace); // log exception TelemetryClient.TrackExceptionEx(ex, sc.Context.Activity, sc.ActiveDialog?.Id); // send error message to bot user if (ex.ExceptionType == SkillExceptionType.APIAccessDenied) { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(ToDoSharedResponses.ToDoErrorMessage_BotProblem)); } else { await sc.Context.SendActivityAsync(sc.Context.Activity.CreateReply(ToDoSharedResponses.ToDoErrorMessage)); } // clear state var state = await ToDoStateAccessor.GetAsync(sc.Context); state.Clear(); }