trigger OnExceptionAspect from MethodInterceptionAspect

本文关键字:MethodInterceptionAspect from OnExceptionAspect trigger | 更新日期: 2023-09-27 18:37:09

我想在从MyInterceptorAspect.OnInvoke抛出异常时到达MyExceptionAspect.OnException,因此以下代码将返回"非常爱":

    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 不会捕获它。

trigger OnExceptionAspect from MethodInterceptionAspect

在写问题时想通了:)

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

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

    public class MyClass
    {
        [MyExceptionAspect(AspectPriority = 1)]
        [MyInterceptorAspect(AspectPriority = 2)]
        public string Do()
        {
            return "LOVE";
        }
    }
相关文章:
  • 没有找到相关文章