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
不会捕获它。
在写问题时想通了:)
在编译时,PostSharp 使用 OnExceptionAspect
用 try-catch 包装 Do
方法,并在它的第一行插入对 MethodInterceptionAspect.OnInvoke
的调用 - 因此,如果该调用将包含在try
块中,则方面的顺序很重要。
所以这个变化很好地解决了它:
public class MyClass
{
[MyExceptionAspect(AspectPriority = 1)]
[MyInterceptorAspect(AspectPriority = 2)]
public string Do()
{
return "LOVE";
}
}