zoukankan      html  css  js  c++  java
  • 自定义Exception:MVC抛出自定义异常,并以Json方式返回

    相关链接

    优点:

      可以统一处理所有页面的异常,对所有需要返回json数据的异常,都用同样的方法throw new DVMException()。页面展示,controller的错误处理方式一样

      节省编码时间,不用针对每一个controller编写错误json

      throw new DVMException()可以不仅出现在调用层级更深的其他方法中

      编码格式统一

    自定义Exception:

        /// <summary>
        /// NewCRM异常
        /// </summary>
        public class DVMException : Exception
        {
            /// <summary>
            /// 操作结果
            /// </summary>
            public OPResult Result { get; set; }
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="opr">操作结果</param>
            /// <param name="message">消息内容</param>
            public DVMException(OPResult opr, String message)
                : base(message)
            {
    
                Result = opr;
            }
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="opr">返回代码</param>
            /// <param name="message">错误消息</param>
            /// <param name="e">原始异常</param>
            public DVMException(OPResult opr, String message, Exception e)
                : base(message, e)
            {
                Result = opr;
            }
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="message">消息内容</param>
            /// <param name="e">异常栈</param>
            public DVMException(String message, Exception e)
                : base(message, e)
            {
                Result = OPResult.ServerError;
            }
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="e">异常堆栈</param>
            public DVMException(Exception e)
                : base("Server Operation Failed", e)
            {
                Result = OPResult.ServerError;
            }
        }
    
        /// <summary>
        /// 操作结果
        /// </summary>
        public class DVMOPResult
        {
            /// <summary>
            /// 操作是否成功
            /// </summary>
            public Boolean OPSucess { get; set; }
            /// <summary>
            /// 结果代码
            /// </summary>
            public OPResult OPCode { get; set; }
            /// <summary>
            /// 操作结果,类型可变,由Type进行判断
            /// </summary>
            public Object ResultContent { get; set; }
            /// <summary>
            /// 返回类型名称
            /// </summary>
            public String Type { get; set; }
    
            /// <summary>
            /// 返回是否为数组
            /// </summary>
            public Boolean IsArray { get; set; }
        }
    

      

    自定义HandleErrorAttribute

         public class HandleJsonExceptionAttribute:HandleErrorAttribute
        {
             public override void OnException(ExceptionContext filterContext)
            {
                var logger = IocFactory.Instance.GetInstance<ILogBase>();
                var exception = filterContext.Exception;
                var url = filterContext.HttpContext.Request.RawUrl;
                String message = exception.Message;
                logger.Error(String.Format("Request error on url {0}: {1}", url, message), exception);
                JsonResult jsonResult = new JsonResult() { MaxJsonLength = Int32.MaxValue };
                jsonResult.Data = message;
                filterContext.Result = jsonResult;
                filterContext.ExceptionHandled = true;
            }
        }
    

    controller中使用:[HandleJsonException]

            [HttpPost]
            [HandleJsonException]
            public ActionResult Save(SaveAccountRequest request)
            {
                var accountDTO = request as AccountDTO;
                FixRatePost(ref accountDTO);
                request.UserId = this.CurrentUser.UserId;
                var id =_accountService.SaveAccount(request);
                if (id < 0)
                {
                    throw new DVMException(OPResult.ServerError, "此账户已存在并启用,无法重复创建");
                }
                return new JsonResult { Data = true };
            }
    

      

    View展示异常:ajax的error处理

             postCreation: function (successMessage) {
                    $.ajax({
                        data: $("form").serialize(),
                        url: "@Url.Content("~/Account/Save")",
                        type: 'POST',
                        dataType: 'json',
                        cache: false,
                        success: function (data) {
                            if (data.toString() == "true") {
                                $.Dialog({
                                    overlay: true,
                                    shadow: true,
                                    flat: false,
                                    icon: '',
                                     330,
                                    content: '<div class="" style="text-align:left;padding:10px;font-size:16px;">' + successMessage + '</div>'
                                            + '<div class="size4 text-right">'
                                                + '<button class="warning" id="comfirm"><i class="icon-checkmark on-left"></i>关闭</button> '
                                            + '</div>',
                                    overlayClickClose: false,
                                    onShow: function (_dialog) {
                                        $("#comfirm", $(_dialog)).click(function () {
                                            //保存成功返回列表页
                                            $("#cancel").click();
                                        })
                                    }
                                });
                            } else {
                                showAlert(data);
                            };
                            freezeButton(false);
                        },
                        error: function (data) {
                            showAlert(data);
                            freezeButton(false);
                        }
                    });
                }
    

      

      

  • 相关阅读:
    C++笔记(2018/2/6)
    2017级面向对象程序设计寒假作业1
    谁是你的潜在朋友
    A1095 Cars on Campus (30)(30 分)
    A1083 List Grades (25)(25 分)
    A1075 PAT Judge (25)(25 分)
    A1012 The Best Rank (25)(25 分)
    1009 说反话 (20)(20 分)
    A1055 The World's Richest(25 分)
    A1025 PAT Ranking (25)(25 分)
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/7660383.html
Copyright © 2011-2022 走看看