如下,一个正常的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产生异常时不会再给你报出任何异常详细信息。