如何在方法中使用多个 return 语句在 PostSharp 中应用异常方面?

How to apply exception aspect in PostSharp with multiple return statements in method?

我在 ASP.NET MVC 项目的 Controller 内部使用 PostSharp 方面进行异常处理。简化后的代码是这样的:

 [ExceptionAspect(AspectPriority = 1)]
 public ActionResult MarkeSettings()
 {
   try{
       SaveData();
       NotifyUser("success");
       return RedirectToAction("A");
     }
   catch(Exception ex){
      NotifyUser(ex.Message);
      return RedirectToAction("B");
   }
 }

我有 class ExceptionAspect 继承自 OnExceptionAspect class。在 OnException(MethodExecutionArgs args) 方法中我设置 args.FlowBehavior = FlowBehavior.Continue;.

那么,我怎样才能摆脱这个 try/catch 块并控制程序执行流程并为 ReturnRedirectToAction() 采取适当的措施?我阅读了有关 Sharing state between advices 的信息,但无法弄清楚如何将其应用于我的问题。

当您将 ExceptionAspect 应用于控制器的方法时,它将使用 try/catch 块包装该方法并从引入的 catch 块中调用 OnException(MethodExecutionArgs args)

这意味着您可以将常见的异常处理代码从 catch 块移动到方面内的 OnException 方法。我想您想在发生异常时将用户重定向到特定操作。 RedirectToAction是returns RedirectToRouteResult控制器的一个受保护的方法。因此,您需要在 OnException 方法中构造 return 一个正确的 RedirectToRouteResult 实例。要更改方法的 return 值,请将 args.ReturnValue 设置为所需的值,并将 args.FlowBehavior 设置为 FlowBehavior.Return

下面是 OnExceptionAspect 实现的例子:

[Serializable]
public class RedirectOnExceptionAttribute : OnExceptionAspect
{
    public string ToAction { get; set; }

    public override void OnException(MethodExecutionArgs args)
    {
        // NotifyUser(args.Exception.Message);

        args.FlowBehavior = FlowBehavior.Return;

        object controller = ((ControllerBase) args.Instance).ControllerContext.RouteData.Values["controller"];
        args.ReturnValue = new RedirectToRouteResult(
            new RouteValueDictionary
                {
                    {"action", this.ToAction},
                    {"controller", controller}
                });
    }
}

应用于控制器方法:

[RedirectOnException(ToAction = "B")]
public ActionResult MarkeSettings()
{
    SaveData();
    NotifyUser("success");
    return RedirectToAction("A");
}