1. 程式人生 > >ajax請求產生異常的處理

ajax請求產生異常的處理

如下,一個正常的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產生異常時不會再給你報出任何異常詳細資訊。