从MethodInterceptionAspect触发OnExceptionAspect

时间:2015-01-09 23:01:59

标签: c# exception interceptor postsharp

我希望在MyExceptionAspect.OnException抛出异常时转到MyInterceptorAspect.OnInvoke,以便以下代码返回“很多爱”:

    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捕获。

1 个答案:

答案 0 :(得分:0)

在撰写问题时想出来:)

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

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

    public class MyClass
    {

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