如下,一个正常的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产生异常时不会再给你报出任何异常详细信息。
版权声明:本文为weixin_41809916原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。