从 MethodInterceptionAspect 触发 OnExceptionAspect

trigger OnExceptionAspect from MethodInterceptionAspect

我想在 MyInterceptorAspect.OnInvoke 抛出异常时到达 MyExceptionAspect.OnException,所以下面的代码将 return "Much love":

    public class MyClass
    {
        [MyInterceptorAspect]
        [MyExceptionAspect]
        public string Do()
        {
            return "LOVE";
        }
    }

    [Serializable]
    public sealed class MyInterceptorAspect : MethodInterceptionAspect
    {
        public override void OnInvoke(MethodInterceptionArgs args)
        {
            // ...
            throw new Exception("Much love");
            // ...
            // base.OnInvoke(args) is NOT called.
        }
    }

    [Serializable]
    public sealed class MyExceptionAspect : OnExceptionAspect
    {
        public override void OnException(MethodExecutionArgs args)
        {
            args.ReturnValue = args.Exception.Message;
            args.FlowBehavior = FlowBehavior.Return;
        }
    }

在运行时,当拦截器抛出异常时,它没有被OnExceptionAspect捕获。

写题的时候想出来了:)

在编译时,PostSharp 使用 OnExceptionAspect 用 try-catch 包装 Do 方法,并在它的第一行插入对 MethodInterceptionAspect.OnInvoke 的调用 - 所以如果该调用将包含在 try 块中,则方面的顺序对事实很重要。

所以这个改变很好地解决了它:

    public class MyClass
    {

        [MyExceptionAspect(AspectPriority = 1)]
        [MyInterceptorAspect(AspectPriority = 2)]
        public string Do()
        {
            return "LOVE";
        }
    }