【发布时间】:2013-06-25 17:10:32
【问题描述】:
我正在开发一个 ASP.NET MVC 应用程序,我需要在其中捕获业务逻辑类中的错误并重定向到错误控制器。我需要捕获两个错误,这些错误与我的业务逻辑相关,而其他错误则是应用程序异常。如果我从业务逻辑中抛出异常,如何在当前控制器中捕获该异常以及如何重定向到 ErrorController?
【问题讨论】:
标签: asp.net-mvc exception
我正在开发一个 ASP.NET MVC 应用程序,我需要在其中捕获业务逻辑类中的错误并重定向到错误控制器。我需要捕获两个错误,这些错误与我的业务逻辑相关,而其他错误则是应用程序异常。如果我从业务逻辑中抛出异常,如何在当前控制器中捕获该异常以及如何重定向到 ErrorController?
【问题讨论】:
标签: asp.net-mvc exception
您可以使用[HandleErrorAttribute] 来装饰您的控制器/动作来做到这一点。
例如:
[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 中的全局过滤器。
【讨论】:
ViewBag?
我认为看看这个样本是个好主意。当业务逻辑层发生错误时,您可以为业务类的方法返回 false 或说 -1,然后向用户显示正确的错误消息,并且在捕获业务方法的一部分时,您可以使用流行的错误日志库之一,例如Log4NET 或 elmah。
编辑: 要在发生错误时重定向用户,您可以在 web config 的自定义错误部分中指定错误控制器
【讨论】: