2

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

4

2 回答 2

2

你可以用 来装饰你的控制器/动作[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"
    }); 

PS:上面的例子假设你的 'Error/GeneralError/OrdersError'ViewsShared文件夹中。如果不是,您将需要指定完整路径。

编辑(根据您的评论):

如果要返回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.

于 2013-06-26T08:55:24.257 回答
-1

我认为看看这个样本是个好主意。当业务逻辑层发生错误时,您可以为业务类的方法返回 false 或说 -1,然后向用户显示正确的错误消息,并且在捕获业务方法的一部分时,您可以使用流行的错误日志库之一,例如Log4NET 或 elmah。

编辑:要在发生错误时重定向用户,您可以在 web config 的自定义错误部分指定错误控制器

于 2013-06-25T17:35:46.673 回答