一.自定義錯誤頁面
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;
}
}
