编程语言
首页 > 编程语言> > C#| MS BotBuilder | DefaultIfException的用法

C#| MS BotBuilder | DefaultIfException的用法

作者:互联网

我正在尝试查找有关如何在MS Bot构建器SDK中使用DefaultIfException的一些文档.据我所知,尚无关于其用法的文档.

我们正在努力避免向用户发布“对不起,我的机器人代码有问题”消息.使用DefaultIfException会执行所说的操作并“阻止异常的传播”,但是我不确定如何发布我自己的错误消息,而不是什么也不发.

如果我们有办法告诉bot框架使用自定义错误对话框类或类似的东西,那就太好了.

编辑代码示例:

等待Conversation.SendAsync(activity,()=> new RootDialog().DefaultIfException());

其中RootDialog()是我们自定义的对话框类,它仅实现IDialog< object>

您会注意到是否实现了IDialog< object>您可以访问公共异步任务StartAsync(IDialogContext上下文).在此方法中,我们调用context.Wait(MessageReceivedAsync);,然后具有以下内容:公共异步任务MessageReceivedAsync(IDialogContext上下文,IAwaitable< IMessageActivity>参数)

在此方法中,我们处理消息,然后将处理包装在try-catch中,然后处理错误.

需要明确的是-我们实际上并没有使用DefaultIfException,因为它不允许我们使用自己的错误消息.但是,如果您只是想停止错误传播,则可以只使用DefaulIfException

解决方法:

我将从DefaultIfExceptionDialog修改代码,如下所示:

[Serializable]
public sealed class ErrorMessageDialog<T, E> : IDialog<T> where E : Exception
{
    public readonly IDialog<T> Antecedent;
    public ErrorMessageDialog(IDialog<T> antecedent)
    {
        SetField.NotNull(out this.Antecedent, nameof(antecedent), antecedent);
    }
    async Task IDialog<T>.StartAsync(IDialogContext context)
    {
        context.Call<T>(this.Antecedent, ResumeAsync);
    }
    private async Task ResumeAsync(IDialogContext context, IAwaitable<T> result)
    {
        try
        {
            context.Done(await result);
        }
        catch (E)
        {
            await context.PostAsync("sorry");
            context.Done(default(T));
        }
    }

标签:botframework,botbuilder,c
来源: https://codeday.me/bug/20191026/1936418.html