0

我在Controller类中有以下代码,出于某种原因,尽管我实现了异常处理以及try.....catch块,但我仍然无法捕获我的异常。

我只是在执行一个测试,在DAO类中,我更改了插入数据库的 sql 字符串以省略一列,这样DAO就会失败。DAO类失败并且错误被写入日志,但是即使officerManager.RegisterOfficer(officer)不成功,代码也会继续返回model.addAttribute("results","Record Was Saved")。

这不准确,我希望控制器抛出错误。下面是代码。

控制器

@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");
         }



     }

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);
    }       
}
4

1 回答 1

1

您不允许错误冒泡回到控制器。

您正在处理 DAO 中的异常,在这种情况下,方法正常退出,并且在 Controller 中没有捕获到异常。

要么不要用 try catch 包围 DAO 并让异常冒泡回控制器(推荐),要么捕获并重新抛出异常(如果你遵循这条路线,作为 RuntimeException 抛出,或者创建你自己的,或者重新抛出为RuntimeException,这样您就不必一直捕获调用堆栈。)

此外,捕获通用异常通常不受欢迎,因为除非您查看日志,否则很难准确确定导致它的原因。提前知道要处理哪些异常通常是更好的做法。

于 2012-10-16T01:47:13.763 回答