-
使用 @ ExceptionHandler 注解
-
實現 HandlerExceptionResolver 接口
-
使用 @controlleradvice 注解
1. 使用 @ ExceptionHandler 注解
使用該注解有一個不好的地方就是:進行異常處理的方法必須與出錯的方法在同一個Controller里面,可以看到,這種方式最大的缺陷就是不能全局控制異常。每個類都要寫一遍。
@Controller
public class UserController {
/**
* 模擬 NullPointerException
* @return
*/
@RequestMapping("/show1")
public String showInfo(){
String str = null;
str.length();
return "index";
}
/**
* 模擬 ArithmeticException
* @return
*/
@RequestMapping("/show2")
public String showInfo2(){
int a = 10/0;
return "index";
}
/**
* java.lang.ArithmeticException
* 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視圖的指定
* 參數 Exception e:會將產生異常對象注入到方法中
*/
@ExceptionHandler(value={java.lang.ArithmeticException.class})
public ModelAndView arithmeticExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.setViewName("error1");
return mv;
}
/**
* java.lang.NullPointerException
* 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視
圖的指定
* 參數 Exception e:會將產生異常對象注入到方法中
*/
@ExceptionHandler(value={java.lang.NullPointerException.class})
public ModelAndView nullPointerExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.setViewName("error2");
return mv;
}
}
2. 使用 @controlleradvice 注解+@ExceptionHandler
上文說到 @ ExceptionHandler 需要進行異常處理的方法必須與出錯的方法在同一個Controller里面。那么當代碼加入了 @ControllerAdvice,則不需要必須在同一個 controller 中了。這也是 Spring 3.2 帶來的新特性。從名字上可以看出大體意思是控制器增強。 也就是說,@controlleradvice + @ ExceptionHandler 也可以實現全局的異常捕捉。
請確保此WebExceptionHandle 類能被掃描到並裝載進 Spring 容器中
@ControllerAdvice
public class GlobalException {
/**
* java.lang.ArithmeticException
* 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視圖的指定
* 參數 Exception e:會將產生異常對象注入到方法中
*/
@ExceptionHandler(value={java.lang.ArithmeticException.class})
public ModelAndView arithmeticExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString()+" -- advice");
mv.setViewName("error1");
return mv;
}
/**
* java.lang.NullPointerException
* 該方法需要返回一個 ModelAndView:目的是可以讓我們封裝異常信息以及視
圖的指定
* 參數 Exception e:會將產生異常對象注入到方法中
*/
@ExceptionHandler(value={java.lang.NullPointerException.class})
public ModelAndView nullPointerExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString()+" -- advice");
mv.setViewName("error2");
return mv;
}
}
如果 @ExceptionHandler 注解中未聲明要處理的異常類型,則默認為參數列表中的異常類型。所以還可以寫成這樣:
@ControllerAdvice
public class GlobalExceptionHandler { @ExceptionHandler() @ResponseBody String handleException(Exception e){ return "Exception Deal! " + e.getMessage(); } }
控制器中就只有業務處理的代碼了
@Controller
public class UserController {
/**
* 模擬 NullPointerException
* @return
*/
@RequestMapping("/show1")
public String showInfo(){
String str = null;
str.length();
return "index";
}
/**
* 模擬 ArithmeticException
* @return
*/
@RequestMapping("/show2")
public String showInfo2(){
int a = 10/0;
return "index";
}
}
3.實現 HandlerExceptionResolver 接口
項目中的異常需要統一處理,正常情況下,需要提前准備好一個錯誤頁面,當項目出錯了,將該頁面展示給用戶。
@Component //注意該類需要交給Spring容器管理
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj,Exception ex) {
System.out.println(ex.getMessage());
ModelAndView mv = new ModelAndView();
mv.setViewName("/error.jsp");
return mv;
}
}
