1.通過自定義錯誤頁面
spring boot默認的處理異常的機制:spring boot默認的提供了一套處理異常的機制,一旦出現程序異常spring
boot會向/error發起請求。在spring boot中提供了一個 叫Base exception
controller的類來處理/error的請求。然後跳轉到默認的異常顯示頁面來展示錯誤信息。
如果我們需要將所有的統一跳轉到自定義的錯誤頁面,需要在/src/main/resources/templates目錄下創建error.html頁面
。
例如:
@RequestMapping("/show")
public String showInfo() {
System.out.println("come in");
String str = null;
str.length();
return "index.html";
}
@RequestMapping("/show2")
public String showInfo2() {
System.out.println("come in");
int a = 10/0;
return "index.html";
}
中途出了錯誤會會自動跳轉到error頁面。
2.@ExceptionHandler註解異常捕獲然後處理
參數***Exception會將產生的異常注入到產生的方法中,但是這個註解有個缺點就是隻能針對本類中的異常做處理,並不能對整個項目的異常做處理
。
例如:
@ExceptionHandler(value = {java.lang.NullPointerException.class, java.lang.ArithmeticException.class})
public ModelAndView NullPointerException(Exception e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());
mv.addObject("status","500");
mv.setViewName("error1");
return mv;
}
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView NullPointerException(NullPointerException e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());
mv.addObject("status","500");
mv.setViewName("error1");
return mv;
}
3.@ControllerAdvice+@ExceptionHandler結合使用
這種情況是一般項目中普遍使用的異常捕捉方法,這樣的話就可以對全局的異常進行捕獲,還能對異常進行處理,相對於以上甚至以下的方法都很好用
。
@ControllerAdvice
public class GlobalException {
@ExceptionHandler(value = { java.lang.NullPointerException.class })
public ModelAndView NullPointerException(NullPointerException e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.addObject("status", "500");
mv.setViewName("error1");
return mv;
}
@ExceptionHandler(value = {java.lang.ArithmeticException.class })
public ModelAndView NullPointerException(ArithmeticException e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.addObject("status", "500");
mv.setViewName("error1");
return mv;
}
/*@ExceptionHandler(value = { java.lang.NullPointerException.class, java.lang.ArithmeticException.class })
public ModelAndView NullPointerException(Exception e) {
System.out.println(e);
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.addObject("status", "500");
mv.setViewName("error1");
return mv;
}*/
4.HandlerExceptionResolver全局異常處理類
這種方法有一定的侷限性,但是使用起來也很方便,它只能返回ModelAndView對象
。
例如:
@Configuration
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mv = new ModelAndView();
if(ex instanceof NullPointerException) {
mv.setViewName("error");
}
if(ex instanceof ArithmeticException) {
mv.setViewName("error1");
}
mv.addObject("error",ex.toString());
return mv;
}
}
error,error1對應的是/src/main/resources/templates目錄下創建error.html頁面
簡化版的是:
/*
* 該方法必須有返回值,返回值類型爲:SimpleMappingExceptionResolver
*
* 有點是簡化了前面的方法,但是不能傳遞異常對象
*/
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver() {
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
/*
*
* 參數一:異常的類型,注意必須是異常類型的全名
*
* 參數二:跳轉到視圖的視圖名稱
*
* */
mappings.put("java.lang.NullPointerException", "error");
mappings.put("java.lang.ArithmeticException", "error1");
resolver.setExceptionMappings(mappings);
return resolver;
}