Botframework 如何标记已在bot代码中处理异常?

Botframework 如何标记已在bot代码中处理异常?,botframework,Botframework,我有一个根对话框,它创建了一个子对话框,就像这样 private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) { var message = await result; string userName = context.Activity?.From.Name; var customerForm = new Form

我有一个根对话框,它创建了一个子对话框,就像这样

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var message = await result;

    string userName = context.Activity?.From.Name;

    var customerForm = new FormDialog<CarValuationDialog>(
        new CarValuationDialog(userName),
        () => CarValuationDialog.BuildForm(),
        FormOptions.PromptInStart);

    context.Call(customerForm, FormSubmitted);
}
当子对话框中发生异常时,将执行FormSubmited方法并进入catch块。但是,当该方法完成时,我仍然会看到向用户显示“对不起,我的机器人有问题”类型的消息


我如何告诉bot代码不要触发未处理的异常代码,我相信这是在postenhandledexceptiontouser中?是否需要将标志类型属性设置为true或其他值?

在POST方法中的消息控制器中,使用defaultifexception

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

在POST方法中的消息控制器中,使用defaultifexception

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

当出现异常时,似乎正在使对话框堆栈为空:您不应具有此上下文。请在下面重置:


删除此行,下一条消息将由根对话框处理。出现异常时,对话框堆栈似乎为空:不应具有此上下文。请在下面重置:


删除这一行,下一条消息将由您的根对话框处理

我认为是您的上下文导致了此错误。Reset;。你能添加更多关于根对话框的细节吗?事实证明你是对的。我想我需要context.Reset,但这导致了未处理的异常。删除该调用已起作用。谢谢。是的,看起来你清空了对话框堆栈,所以机器人不知道该做什么。删除此项会导致下一条消息继续由根对话框处理。请将您的评论移到答案中好吗?这样我就可以接受它,只是为了闭包。我想您之所以会出现此错误是因为您的context.Reset;。你能添加更多关于根对话框的细节吗?事实证明你是对的。我想我需要context.Reset,但这导致了未处理的异常。删除该调用已起作用。谢谢。是的,看起来你清空了对话框堆栈,所以机器人不知道该做什么。删除此项会导致下一条消息继续由根对话框处理。请将您的评论移到答案中好吗?这样我就可以接受它,只是为了闭包。在这种情况下,删除对上下文的调用。重置修复了该问题。虽然我将把你的答案保留在笔记中,因为DefaultIfException方法看起来非常有用。在这种情况下,删除对context.Reset的调用修复了这个问题。尽管我将把你的答案保存在笔记中,因为DefaultIfException方法看起来非常有用。
public async Task FormSubmitted(IDialogContext context, IAwaitable<CarValuationDialog> result)
{
    try
    {
        var form = await result;

    }
    catch (FormCanceledException<CarValuationDialog> e)
    {
        string reply;
        if (e.InnerException == null)
        {
            reply = e.Message;
        }
        else
        {
            reply = e.InnerException.Message;
        }

        context.Reset();

        await context.PostAsync(reply);
    }
}