代码之家  ›  专栏  ›  技术社区  ›  Jason Evans

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

  •  1
  • Jason Evans  · 技术社区  · 6 年前

    我有一个根对话框,它创建一个这样的子对话框…

    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);
    }
    

    这个 FormSubmitted 方法看起来像…

    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);
        }
    }
    

    当子对话框中发生异常时,该方法 表单已提交 执行并进入catch块。但是,当该方法完成时,我仍然会看到“抱歉,我的机器人有问题”类型的消息出现在用户面前。

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Nicolas R    6 年前

    当出现异常时,您似乎正在使对话框堆栈为空:您不应该这样做。 context.Reset() 以下:

    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);
        }
    }
    

    删除此行,下一条消息将由根对话框处理。

        2
  •  2
  •   Ein2012    6 年前

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

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