我正在开发一个ASP.NET MVC应用程序,我需要在业务逻辑类中捕获错误并重定向到错误控制器。我需要捕获两个错误,一个与我的业务逻辑相关的错误,另一个是应用程序异常。如果我从业务逻辑中抛出异常,我如何在当前控制器中捕获它,如何重定向到ErrorController?
答案 0 :(得分:2)
您可以使用[HandleErrorAttribute]
修饰您的Controller / Action来做到这一点。
例如:
[HandleError]
public ActionResult PlaceOrder(OrderDetails orderDetails)
{
orderService.PlaceOrder(orderDetails);
return View("Success");
}
您可以设置相应的View
加载以取决于Exception Type
:
[HandleError(ExceptionType=typeof(PlaceOrderException),View="OrdersError"]
[HandleError(ExceptionType=typeof(Exception),View="GeneralError"]
public ActionResult PlaceOrder(OrderDetails orderDetails)
{
orderService.PlaceOrder(orderDetails);
return View("Success");
}
或者,您可以在global.asax
:
GlobalFilters.Filters.Add(new HandleErrorAttribute
{
View = "Error"
});
P.S:上面的示例假设您的'Error / GeneralError / OrdersError'Views
位于Shared
文件夹中。如果他们不是,你将需要指定完整的路径。
修改(根据您的评论):
如果您想返回Json
而不是View
,请创建以下ActionFilter
:
public class HandleErrorJsonAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.Result = new JsonResult
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
ContentType = "application/json",
Data = new
{
Msg = "An Error Occured",
ExceptionMsg = filterContext.Exception.ToString()
}
};
}
}
然后使用新的[HandleErrorJson]
属性(如上所述),或在global.asax
中将其注册为全局过滤器。
答案 1 :(得分:0)
我认为查看此示例是个好主意。如果在业务逻辑层中发生错误,您可以为Business类的方法返回false或者说-1,然后向用户显示正确的错误消息,并且在业务方法的catch部分中,您可以使用流行的错误记录库之一Log4NET或elmah。
编辑: 要在发生错误时重定向用户,您可以在Web配置的自定义错误部分中指定错误控制器