1. 程式人生 > >springmvc 全局異常解決方案

springmvc 全局異常解決方案

his let pre 普通 public .com tro 相同 extends

系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。

系統的dao、service、controller出現都通過throwsException向上拋出,最後由springmvc前端控制器交由異常處理器進行異常處理,如下圖:

技術分享

1.自定義異常類:

package cn.itcast.ssm.exception;  
  
public class CustomerException extends Exception{  
    private String message;//異常信息  
    public CustomerException(String message){  
        this.message=message;  
    }  
    public String getMessage() {  
        return message;  
    }  
    public void setMessage(String message) {  
        this.message = message;  
    }  
}  

2.定義一個全局異常處理器實現HandlerExceptionResolver接口

思路:系統遇到異常,在程序中手動拋出,dao拋給service、service給controller、controller拋給前端控制器,前端控制器調用全局異常處理器。

全局異常處理器:解析出異常類型,如果該異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示,如果該異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”)

package cn.itcast.ssm.exception;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.springframework.web.servlet.HandlerExceptionResolver;  
import org.springframework.web.servlet.ModelAndView;  
  
public class CustomerExceptionResolver implements HandlerExceptionResolver{  
    public ModelAndView resolveException(HttpServletRequest request,  
            HttpServletResponse response, Object handler, Exception ex) {  
          
//      解析出異常類型  
//      如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示  
//      如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”)  
        CustomerException customerException=null;  
        if(ex instanceof CustomerException){  
            customerException=(CustomerException)ex;  
        }else{  
            customerException=new CustomerException("未知錯誤!");  
        }  
        String message = customerException.getMessage();  
        ModelAndView modelAndView=new ModelAndView();  
        modelAndView.addObject("message", message);  
        modelAndView.setViewName("error");  
        return modelAndView;  
    }  
  
}  

如果出現錯誤就轉發到錯誤頁面error.jsp,直接在error.jsp使用EL表達式獲取異常信息顯示:${message}

3.在sprimgmvc.xml中定義全局異常處理器類(與普通的handler配置基本相同)

<!-- 全局異常處理 -->  
<bean class="cn.itcast.ssm.exception.CustomerExceptionResolver"></bean>  

4.進行測試:對於修改頁面拋出拋出異常信息:

1).controller層拋出異常

技術分享

2).service層拋出異常信息

技術分享

3)訪問:

技術分享

springmvc 全局異常解決方案