我在控制器类中有以下代码,出于某种原因虽然我实现了异常处理以及 try ..... catch 块我是仍无法捕捉我的异常。
我正在执行一个测试,在 DAO 类中,我更改了插入数据库的sql字符串,只留下一列,以便 DAO 失败。 DAO 类失败并将错误写入日志,但即使 officerManager.RegisterOfficer(官员)未成功,代码也会继续返回模型.addAttribute(“结果”,“记录被保存”)。
这不准确,我希望控制器抛出错误。下面是代码。
控制器
@RequestMapping(value="officer_registration.htm", method=RequestMethod.POST)
public ModelAndView handleRequest(@Valid @ModelAttribute Officers officer,BindingResult result,ModelMap m,Model model,HttpServletRequest request,HttpServletResponse response)throws Exception{
try{
if(result.hasErrors()){
model.addAttribute("division", myDivision);
model.addAttribute("position", myPosition);
model.addAttribute("gender", myGender);
return new ModelAndView("officer_registration");
}else{
//check the request if its an update or an insert
String user_request = request.getParameter("user_request");
logger.info("The Users Request Was " + user_request);
if (user_request.equals("Save")){
officerManager.RegisterOfficer(officer);
model.addAttribute("results","Record Was Saved");
}else{
officerManager.UpdateOfficer(officer);
model.addAttribute("results","Record Was Updated");
}
model.addAttribute("division", myDivision);
model.addAttribute("position", myPosition);
model.addAttribute("gender", myGender);
return new ModelAndView("officer_registration");
}
}catch(Exception e ){
model.addAttribute("division", myDivision);
model.addAttribute("position", myPosition);
model.addAttribute("gender", myGender);
model.addAttribute("results","Error: Unable to Save Record!");
return new ModelAndView("officer_registration");
}
}
DAO
public void saveOfficer(Officers officer) {
logger.info("In saveOfficer");
//SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
int count = getJdbcTemplate().update("INSERT INTO crimetrack.tblofficers (userName,password, fName, lName, oName, divisionNo, positionId, emailAdd, startDate, endDate, genderId,phoneNo, dob,badgeNo) "+
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
, new Object[]{officer.getUserName(),StringSecurity.EncryptString(officer.getPassword()),officer.getfName(),
officer.getlName(),officer.getoName(),officer.getDivisionNo(),officer.getPositionId(),
officer.getEmailAdd(),officer.getStartDate(),officer.getEndDate(),officer.getGenderId(),
officer.getPhoneNo(),officer.getDob(),officer.getBadgeNo()});
logger.info(count +" Rows affected in tblOfficers");
}catch(Exception e){
logger.error("Could not save officer ", e);
}
}
答案 0 :(得分:1)
您不允许错误冒泡回到控制器。
您正在处理DAO中的异常,在这种情况下,该方法正常退出,并且Controller中没有捕获异常。
要么不用try catch包围DAO并让异常气泡回到控制器(推荐),要么捕获并重新抛出异常(如果你按照这个路径,抛出一个RuntimeException,或者创建你自己的,或者作为RuntimeException重新抛出,这样你就不必一直捕获调用堆栈。)
此外,它通常不赞成捕获一般异常,因为除非你在日志中查看,否则更难确定导致它的原因。知道提前处理哪些例外通常是更好的做法。