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