一.自定義錯誤頁面
SpringBoot 默認的處理異常的機制:SpringBoot 默認的已經提供了一套處理異常的機制。一旦程序中出現了異常 SpringBoot 會向/error 的 url 發送請求。在 springBoot 中提供了一個叫BasicExceptionController 來處理/error 請求,然后跳轉到默認顯示異常的頁面來展示異常信息。
所以我們可以自定義一個名字為error的HTML頁面,自己設置,異常可通過${exception}來取。
二.@ControllerAdvice+@ExceptionHandler 注解處理異常(全局處理)
需要創建一個能夠處理異常的全局異常類;
在該類上需要添加@ControllerAdvice 注解;
方法前需要添加@ExceptionHandler 注解,並設置參數value,值為對應異常類;
該方法需要返回ModelAndView,目的是可以讓我們封裝異常信息以及視圖的指定
例:
@ControllerAdvice public class GlobalException { /** * 參數 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; } }
三.配置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; } }
四.自定義 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; } }