3

MS Bot ビルダー 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 に答える