我希望在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
捕获。
答案 0 :(得分:0)
在撰写问题时想出来:)
在编译时,PostSharp使用OnExceptionAspect
用try-catch包装Do
方法,并在其第一行插入MethodInterceptionAspect.OnInvoke
的调用 - 所以顺序为如果该调用将包含在try
块中,则这些方面很重要。
所以这个改变很好地解决了这个问题:
public class MyClass
{
[MyExceptionAspect(AspectPriority = 1)]
[MyInterceptorAspect(AspectPriority = 2)]
public string Do()
{
return "LOVE";
}
}