ajax請求產生異常的處理
阿新 • • 發佈:2018-12-31
如下,一個正常的ajax請求,如果後臺產生異常怎麼處理。
// 封裝公寓資訊傳入後臺 var apartment = { "apartmentName" : $("#apartmentName").val(), "sex" : $("#sex").val(), "manager" : { // 將管理員ID存入 "managerId" : managerId, "managerName" : $("#managerName").val() }, "totalFloor" : parseInt($("#totalFloor").val()), "totalPeople" : parseInt($("#totalPeople").val()) }$.ajax({ url : "/gradPro/apar/addApar.action", dataType : "json", async : false, type : "post", // 設定請求頭資訊 contentType : "application/json;charset=utf-8", data : JSON.stringify(apartment), success : function(data) { if ("1" == data.status) { // 成功後延時三秒跳轉並提示資訊 countDown(3, data.message); } else if ("0" == data.status) { // 提示錯誤資訊 $("#alterTip").text(data.message); $("#alterTips").modal('show'); } } })
對應的Controller層方法如下:定義的一個簡單異常,如果產生了任何異常情況下,將異常包裝為要返回到js中處理的物件。
然後丟擲異常。當然,這裡其實是錯誤示範,因為從Service如果存在事務拋過來的異常,在這邊Controller層中以及進行了處理。一般定義一個泛型為DTO的類進行包裝,將異常資訊同時放入返回到頁面中即可。也就是說這邊Controller已經不能在往上級拋異常了。這裡是一個錯誤示範。(其實就是自己菜)
/** * 新增新的公寓 * * @param apartment * @return */ @SuppressWarnings("finally") @RequestMapping("addApar.action") @ResponseBody public DataSet addApar(@RequestBody Apartment apartment) { DataSet data = new DataSet(); int temp = 0; try { temp = apartmentService.addApar(apartment); // 如果新增公寓持久化成功 if (1 == temp) { data.setMessage("新增公寓成功"); data.setStatus("1"); } // 如果失敗且未生成異常 else { data.setStatus("0"); data.setMessage("出現未知錯誤"); } } // 如果管理員名稱不對或輸入不合法 catch (Exception e) { DataToolongException ex = new DataToolongException("0", "新增公寓失敗請檢查資料是否正確"); data.setStatus(ex.getErrorCode()); data.setMessage(ex.getErrorMSG()); throw ex; } // 最終返回 finally { return data; } }
最重要的一點!!! 一定要寫finally塊中的返回,或者在catch塊中直接返回資料,否則前臺將直接跳過ajax請求報出500
當然這樣處理有好處也有壞處,好處是簡單易理解,壞處是如果將所有異常包裝為同一個異常後,除非你對邏輯十分了解,否則報錯後控制檯不會打印出具體異常資訊,你會無從下手。如果是要交付的程式碼當然是不能這麼進行處理。
具體效果如下:
控制檯sql產生異常時不會再給你報出任何異常詳細資訊。