0

在我的 winform 程序中,我在每个控制事件上使用 Postsharp 拦截器类来避免 try/catch 块重复。

自定义 postsharp 方法:

[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 bloc 不会捕获任何内容...我该怎么办?谢谢

4

1 回答 1

3

首先,如果您需要一个方面来处理异常,那么通常最好将其实现为OnMethodBoundaryAspectOnExceptionAspect。在您的OnException方法中,您可以设置args.FlowBehaviorFlowBehavior.Return 或 FlowBehavior.Continue以防止引发异常。

除了提供更好的性能外,这些方面还可以通过ApplyToStateMachine属性设置为true. 不过有一个警告——使用状态机是不可能改变异常流行为的。您仍然可以处理异常,但不能阻止它被抛出。

更新。从 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 回答