無論做什么項目,進行異常處理都是非常有必要的,而且你不能把一些只有程序員才能看懂的錯誤代碼拋給用戶去看,所以這時候進行統一的異常處理,展現一個比較友好的錯誤頁面就顯得很有必要了。跟其他MVC框架一樣,springMVC也有自己的異常處理機制。
springMVC提供的異常處理主要有兩種方式,一種是直接實現自己的HandlerExceptionResolver,另一種是使用注解的方式實現一個專門用於處理異常的Controller——ExceptionHandler。
1、實現自己的HandlerExceptionResolver,HandlerExceptionResolver是一個接口,springMVC本身已經對其有了一個自身的實現——DefaultExceptionResolver,該解析器只是對其中的一些比較典型的異常進行了攔截處理。
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.servlet.HandlerExceptionResolver;
- import org.springframework.web.servlet.ModelAndView;
- public class ExceptionHandler implements HandlerExceptionResolver {
- @Override
- public ModelAndView resolveException(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex) {
- // TODO Auto-generated method stub
- return new ModelAndView("exception");
- }
- }
上述的resolveException的第4個參數表示對哪種類型的異常進行處理,如果想同時對多種異常進行處理,可以把它換成一個異常數組。
定義了這樣一個異常處理器之后就要在applicationContext中定義這樣一個bean對象,如:
- <bean id="exceptionResolver" class="com.tiantian.xxx.web.handler.ExceptionHandler"/>
2、使用@ExceptionHandler進行處理
使用@ExceptionHandler進行處理有一個不好的地方是進行異常處理的方法必須與出錯的方法在同一個Controller里面
如:
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import org.springframework.web.bind.annotation.RequestMapping;
- import com.tiantian.blog.web.servlet.MyException;
- @Controller
- public class GlobalController {
- /**
- * 用於處理異常的
- * @return
- */
- @ExceptionHandler({MyException.class})
- public String exception(MyException e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
- return "exception";
- }
- @RequestMapping("test")
- public void test() {
- throw new MyException("出錯了!");
- }
- }
這里在頁面上訪問test方法的時候就會報錯,而擁有該test方法的Controller又擁有一個處理該異常的方法,這個時候處理異常的方法就會被調用
當發生異常的時候,上述兩種方式都使用了的時候,第一種方式會將第二種方式覆蓋
