如何在MVC ASP.NET中处理业务逻辑层的业务逻辑错误和应用程序异常

时间:2013-06-25 17:10:32

标签: asp.net-mvc exception

我正在开发一个ASP.NET MVC应用程序,我需要在业务逻辑类中捕获错误并重定向到错误控制器。我需要捕获两个错误,一个与我的业务逻辑相关的错误,另一个是应用程序异常。如果我从业务逻辑中抛出异常,我如何在当前控制器中捕获它,如何重定向到ErrorController?

2 个答案:

答案 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配置的自定义错误部分中指定错误控制器