在post sharp中访问返回值

时间:2013-11-19 11:38:34

标签: c# postsharp

我刚接触这个问题的新手

我创建了一个异常方面,在onexception中我设置了这个返回值

 public class aspect:OnExceptionAspect
 {
   public override void OnException(MethodExecutionArgs args)
    {
        args.ReturnValue=-100;
       args.FlowBehaviour=FlowBehavior.Continue;
    }
  }

我在这里使用方面

DBLayer
{
   [ExceptionAspect()) 
    public int GetMeVal()
       {
            throw new Exception();
          //now how to get the args.returnValue of -100 here
           //remaining code needs to be executed ?
        }
}

的HomeController

ControllerMethod()
{
    x=DBLayer.GetMeVal() -- Here I want the -100 to be returned
  /// need to set status code based on x value
}

1)请告诉我如何实现上述目标?

谢谢

1 个答案:

答案 0 :(得分:1)

不,抛出异常后无法执行剩余的代码。 应用方面后,您的方法将与此类似(简化):

public int GetMeVal()
{
    try
    {
        throw new Exception();
        // remaining code
    }
    catch
    {
        return -100;
    }
 }

正如您所看到的,异常会在catch块中捕获,并且无法执行剩余代码。您可以尝试做的是将剩余的代码重构为另一种方法或其他方面。

如果您在当前方面之前有另一个OnMethodBoundaryAspect方面,则FlowBehavior.Return会调用另一方面的OnExit(MethodExecutionArgs)方法。如果适用,您可以将“剩余代码”移至OnExit(MethodExecutionArgs)方法,并使用MethodExecutionArgs.ReturnValue访问返回值。

[Serializable]
public class Aspect : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        args.ReturnValue=-100;
        args.FlowBehaviour=FlowBehavior.Return;
    }
}

[Serializable]
public class Aspect2 : OnMethodBoundaryAspect
{
    public override void OnExit(MethodExecutionArgs args)
    {
        Console.WriteLine("Return value = {0}", args.ReturnValue);
        // remaining code
    }
}

[Aspect2(AspectPriority = 1)]
[Aspect(AspectPriority = 2)]
public int GetMeVal()
{
    // ...
}