SpringBoot提供了多種處理異常方式,以下為常用的幾種
1. 自定義錯誤異常頁面
SpringBoot默認的處理異常的機制:SpringBoot默認的已經提供了一套處理異常的機制。一旦程序中出現了異常SpringBoot會像/error的url發送請求。在springBoot中提供了一個叫BasicExceptionController來處理/error請求,然后跳轉到默認顯示異常的頁面來展示異常信息。
如果我們需要將所有的異常同一跳轉到自定義的錯誤頁面,需要再src/main/resources/templates目錄下創建error.html頁面。注意:名稱必須叫error
2. @ExceptionHandle注解處理異常
注解使用方式
/** * 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; }
頁面代碼
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>錯誤提示頁面-ArithmeticException</title> </head> <body> 出錯了,請與管理員聯系。。。 <span th:text="${error}"></span> </body> </html>
3. @ControllerAdvice+@ExceptionHandler注解處理異常
需要創建一個能夠處理異常的全局異常類。在該類上需要添加@ControllerAdvice注解
/** * 全局異常處理類 * * */ @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()); mv.setViewName("error1"); return mv; } }
4. 配置SimpleMappingExceptionResolver處理異常
在全局異常類中添加一個方法完成異常的同一處理
/** * 通過SimpleMappingExceptionResolver做全局異常處理 * * */ @Configuration public class GlobalException { /** * 該方法必須要有返回值。返回值類型必須是:SimpleMappingExceptionResolver */ @Bean public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){ SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver(); Properties mappings = new Properties(); /** * 參數一:異常的類型,注意必須是異常類型的全名 * 參數二:視圖名稱 */ mappings.put("java.lang.ArithmeticException", "error1"); mappings.put("java.lang.NullPointerException","error2"); //設置異常與視圖映射信息的 resolver.setExceptionMappings(mappings); return resolver; } }
5. 自定義HandlerExceptionResolver類處理異常
需要再全局異常處理類中實現HandlerExceptionResolver接口
/** * 通過實現HandlerExceptionResolver接口做全局異常處理 * * */ @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 ArithmeticException){ mv.setViewName("error1"); } if(ex instanceof NullPointerException){ mv.setViewName("error2"); } mv.addObject("error", ex.toString()); return mv; } }