C# | MS BotBuilder | DefaultIfException 的用法

C# | MS BotBuilder | Usage of DefaultIfException

我正在尝试查找有关如何在 MS Bot 生成器 SDK 中使用 DefaultIfException 的一些文档。据我所知,没有关于其用法的文档。

我们正在努力避免 'sorry my bot code is having an issue' 消息被 post 发送给用户。使用 DefaultIfException 会按照它说的做 'stops the propagation of the exception',但我不确定如何 post 我自己的错误消息,而不是什么都没有。

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

编辑代码示例: await Conversation.SendAsync(activity, () => new RootDialog().DefaultIfException()); RootDialog() 是我们的自定义对话框 class,它简单地实现了 IDialog<object>

您会注意到,如果您实施 IDialog<object>,您就可以访问 public async Task StartAsync(IDialogContext context)。在这个方法中我们调用 context.Wait(MessageReceivedAsync);,然后有这个:public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)

在这个方法中,我们处理消息,并将处理包装在 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));
        }
    }