自定義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: '',
                                width: 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);
                    }
                });
            }

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM