如何在方法中使用多个 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");
}
我在 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");
}