从 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";
}
}
我想在 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";
}
}