0

私のwinformプログラムでは、各コントロールイベントでPostsharpインターセプタークラスを使用して、try/catchブロックの繰り返しを回避しています。

カスタム ポストシャープ メソッド:

[Serializable]
public class OnErrorShowMessageBox : MethodInterceptionAspect
{
    public override void OnInvoke(MethodInterceptionArgs args)
    {
        try
        {               
            args.Proceed();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            args.ReturnValue = null;
        }
    }
}

この属性を使用します。

    [OnErrorShowMessageBox]
    private void txtComments_TextChanged(object sender, EventArgs e)
    {
       //blabla
    }

これは魅力のように機能しますが、イベントで非同期を使用したいことを知っています。したがって、txtComments_textChanged は次のようになります。

    [OnErrorShowMessageBox]
    private async void txtComments_TextChanged(object sender, EventArgs e)
    {
        await //blabla
    }

そして、ここで問題が発生します。インターセプターメソッドの try/catch ブロックは、非同期の場合は何もキャッチしません...どうすればよいですか? ありがとう

4

1 に答える 1

3

まず、例外を処理するアスペクトが必要な場合は、通常はOnMethodBoundaryAspectまたはOnExceptionAspectとして実装することをお勧めします。OnExceptionメソッドでFlowBehavior.Return または FlowBehavior.Continueargs.FlowBehaviorに設定して、例外がスローされないようにすることができます。

パフォーマンスの向上に加えて、プロパティを に設定することで、これらの側面を非同期メソッドに適用することもできます。ただし、注意点があります。ステート マシンでは、例外フローの動作を変更することはできません。例外を処理することはできますが、例外がスローされるのを防ぐことはできません。ApplyToStateMachinetrue

アップデート。PostSharp 5.0 以降では、非同期メソッドのフロー動作を変更できます。

[Serializable]
public class MyAspect : OnExceptionAspect
{
    public MyAspect()
    {
        this.ApplyToStateMachine = true;
    }

    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine("OnException({0});", args.Exception.Message);
    }
}

アスペクトが非同期メソッドに適用されない場合は、次の例に示すように、メッセージ ボックスを表示して例外を無視できます。

アップデート。PostSharp 5.0 以降では、次の例は非同期メソッドでも機能します。

[Serializable]
public class MyAspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        args.ReturnValue = null;
        args.FlowBehavior = FlowBehavior.Return;
    }
}
于 2015-03-26T18:09:21.120 に答える