對異常處理的思路
系統中異常包括兩類:編譯時異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。
系統的dao、service、controller出現異常都通過throws Exception向上拋出,最後由springmvc前端控制器交由異常處理器進行異常處理
SpringMVC異常處理
- 自定義異常類
package com.bamzhy.exception;
public class CustomException extends Exception {
public static final long serialVersionUID=1L;
//
public CustomException(String message) {
super(message);
this.message = message;
}
//異常信息
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
- 自定義異常視圖解析器
package com.bamzhy.exception;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
CustomException customException=null;
//如果拋出的是系統自定義異常則直接轉換
if (e instanceof CustomException){
customException=(CustomException)e;
}else{
//如果拋出的不是系統自定的異常則重新構造一個系統錯誤異常
customException=new CustomException("跟管理員聯繫也沒用把電腦關了吧");
}
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("message",customException.getMessage());
System.out.println(customException.getMessage());
//設定好要跳轉到的頁面
modelAndView.setViewName("/WEB-INF/error.jsp");
return modelAndView;
}
- 自定義異常視圖頁面
package com.bamzhy.Controller;
import com.bamzhy.bean.User;
import com.bamzhy.exception.CustomException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ErrorController {
@RequestMapping("/haha12345")
public void test() throws CustomException{
if (true){
throw new CustomException("用戶名不存在!");
}
}
}
- 測試+結果
輸入:http://localhost:8080/haha12345
結果:
值得一提的一個小bug
- 當我配置了FreeMarker的view解析器時,你重定向.jsp文件,spring會報
javax.servlet.ServletException: Could not resolve view with name ‘/WEB-INF/error.jsp’ in servlet with name ‘springmvcservlet’ - 這個說明了spring是需要view解析器的,如果你自己定義了不讓他用默認的,但是自己定義的又用不了他就會告訴你這個url他沒辦法給你解析。(其實是DispatcherServlet不知道給哪個view解析器)
這個bug真折騰人。