ajax请求产生异常的处理

时间:2022-03-03 07:05:44

如下,一个正常的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

当然这样处理有好处也有坏处,好处是简单易理解,坏处是如果将所有异常包装为同一个异常后,除非你对逻辑十分了解,否则报错后控制台不会打印出具体异常信息,你会无从下手。如果是要交付的代码当然是不能这么进行处理。

具体效果如下:

ajax请求产生异常的处理

控制台sql产生异常时不会再给你报出任何异常详细信息。

ajax请求产生异常的处理