【问题标题】:How to handle business logic errors and application exceptions from business logic layer in MVC ASP.NET如何处理 MVC ASP.NET 中业务逻辑层的业务逻辑错误和应用程序异常
【发布时间】:2013-06-25 17:10:32
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc exception


    【解决方案1】:

    您可以使用[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'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 中的全局过滤器。

    【讨论】:

    • haim770 感谢您的回复。我的应用程序是单页的,所以我只有一个视图。我想以 Json 格式将错误详细信息(如 msg:An error occurred.. etc)发送到我的索引视图,然后我想以适当的格式显示此错误信息。
    • 我相应地修改了我的答案。
    • haim770,它不适合我。我给你我在做什么的示例: [HandleErrorJson] public JsonResult testControler() { 这里的一些代码调用业务逻辑中的业务逻辑类我检查是否有任何与业务相关的验证错误,如果是,我想将错误消息发送到我的客户端(JS 代码),json 格式 }
    • 发生错误时,它似乎在 HandleErrorJsonAttribute 类中执行您的 OnException(ExceptionContext filterContext) 方法,但不会将形成的 json 发送到视图(在我的情况下为索引)
    • 您想返回 Json 结果或视图结果,并将异常详细信息嵌入视图中的某处?自动设置在ViewBag
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 Persian Dev(Sepasgozaram !) ham770 的上述回答解决了我的问题。我需要的是在 BLL 中引发验证错误或应用程序异常,并向客户端发送带有错误/异常详细信息的 Json 响应。在客户端,我想处理传入的 json 响应并以所需的格式显示错误。
    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 2011-09-03
    • 2016-11-14
    • 2012-07-18
    • 2015-11-10
    • 2017-01-10
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多