自定义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);
                    }
                });
            }

  

  

原文地址:https://www.cnblogs.com/panpanwelcome/p/7660383.html