3

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

我们试图避免向用户发布“对不起,我的机器人代码有问题”的消息。使用 DefaultIfException 执行它所说的并“停止传播异常”,但是我不确定如何发布我自己的错误消息,而不是什么都没有。

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

编辑代码示例: 我们的自定义对话框类在哪里,它只是 await Conversation.SendAsync(activity, () => new RootDialog().DefaultIfException()); 实现RootDialog()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

4

1 回答 1

4

我将修改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));
        }
    }
于 2016-12-20T18:49:30.143 回答