Spring MVC 異常處理

對異常處理的思路

系統中異常包括兩類:編譯時異常和運行時異常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真折騰人。

發佈了85 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章