springboot--異常處理
阿新 • • 發佈:2018-11-25
目錄
配置SimpleMappingExceptionResolver處理異常
自定義HandlerExceptionResolver類處理異常
SpringBoot中異常處理方式
SpringBoot對異常處理提供了五種方式
- 自定義錯誤頁面:所有的異常都會跳轉到指定的頁面
- @ExceptionHandle註解處理異常:為每一種異常情況都創造一個方法,且為非全域性異常處理,只會對當前類產生作用
- [email protected]註解處理異常:建立一個特定的類處理異常,為全域性異常處理
- 配置SimpleMappingExceptionResolver處理異常:可將多種異常與頁面進行繫結,但頁面無法顯示異常資訊
- 自定義HandlerExceptionResolver類處理異常:利用判斷的方法將異常頁面進行繫結,且頁面中可以顯示異常資訊
SpringBoot預設的異常處理方式
當出現異常時SpringBoot預設會向/error的url傳送請求。在SpringBoot中提供了一個BasicExceptionController類處理/error請求,該類會跳轉到預設錯誤顯示頁面顯示異常資訊。
自定義錯誤處理頁面
- src/mian/templtes/資料夾下建立一個名稱為error的頁面,SpringBoot在遇到異常資訊時,會跳轉到該頁面
- 在error頁面中可以用${exception}屬性顯示異常型別
-
<body> <h1>出現了錯誤,請與管理員聯絡</h1> <!--BasicExceptionController會將錯誤資訊型別封裝到exception屬性中--> <span th:text="${exception}"></span>
- 這種處理方式將導致所有的異常都會跳轉到該頁面,對使用者不太友好。
@ExceptionHandler處理異常
- 缺點:需要為多個異常新增方法,是程式碼產生冗餘
- 在Controller類中新增@ExceptionHandler註解
-
/** * 使用@ExceptionHandler註解表名該方法用來處理異常資訊,註解的value屬性指明處理異常資訊的種類,異常種類用{包裹} * value的值是一個數組,可以新增多個異常種類 * @param e 將異常資訊注入到方法中 * @return 返回一個ModelAndView用來封裝異常資訊,並指定檢視 */ @ExceptionHandler(value = {java.lang.ArithmeticException.class,java.lang.NullPointerException.class}) public ModelAndView showInfo2(Exception e){ ModelAndView modelAndView = new ModelAndView(); // 將異常資訊轉化成字串封裝到modelAndView中 modelAndView.addObject("error",e.toString()); // 指定顯示該異常資訊的頁面為error1 modelAndView.setViewName("error1"); // 返回該ModelAndView return modelAndView; }
- 在前臺顯示錯誤資訊
-
<!--去除前臺傳過來的model值,用以顯示錯誤資訊--> <span th:text="${error}"></span>
@[email protected]註解處理異常
- 建立一個類並加上@ControllerAdvice註解,在該類中使用@ExceptionHandler方法處理異常。這樣可以做到專案中產生的所有的異常資訊都會被該類處理
-
@ControllerAdvice public class GlobalException { /** * 使用@ExceptionHandler註解表名該方法用來處理異常資訊,註解的value屬性指明處理異常資訊的種類,異常種類用{包裹} * value的值是一個數組,可以新增多個異常種類 * @param e 將異常資訊注入到方法中 * @return 返回一個ModelAndView用來封裝異常資訊,並指定檢視 */ @ExceptionHandler(value = {java.lang.ArithmeticException.class,java.lang.NullPointerException.class}) public ModelAndView showInfo2(Exception e){ ModelAndView modelAndView = new ModelAndView(); // 將異常資訊轉化成字串封裝到modelAndView中 modelAndView.addObject("error",e.toString()); // 指定顯示該異常資訊的頁面為error1 modelAndView.setViewName("error1"); // 返回該ModelAndView return modelAndView; } }
配置SimpleMappingExceptionResolver處理異常
- 此種方式的缺點是:只能異常種類跳轉到對應的顯示頁面,但不能顯示異常資訊。
- 建立一個類,在類上加上@Configuration註解用來標明該類是配置類。建立一個方法,在方法上加上@Bean註解,此方法的返回值應當是SimpleMappingExceptionResolver。
- 在方法中將異常種類與顯示頁面進行繫結
-
//該註解說明該類是一個配置類,SpringBoot在啟動時會對添加了@Configuration的類進行處理 @Configuration public class GlobalException { @Bean // SpringBoot會對所有添加了@Configuration的類中新增@Bean的方法進行執行 public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){ SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver(); Properties properties = new Properties(); // 將異常資訊與顯示異常資訊的頁面進行配對 properties.setProperty("java.lang.ArithmeticException","error1"); properties.setProperty("java.lang.NullPointerException","error1"); // 將properties放進simpleMappingExceptionResolver中 simpleMappingExceptionResolver.setExceptionMappings(properties); return simpleMappingExceptionResolver; } }
自定義HandlerExceptionResolver類處理異常
- 自定義一個類,為該類加上@Configuration註解,並且實現HandlerExceptionResolver介面
-
//該註解說明該類是一個配置類,SpringBoot在啟動時會對添加了@Configuration的類進行處理 @Configuration public class GlobalException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView modelAndView = new ModelAndView(); // 判斷異常屬於哪一類,根據不同的種類跳轉到不同的頁面 if (e instanceof ArithmeticException){ modelAndView.addObject("error",e.toString()); modelAndView.setViewName("error1"); } if (e instanceof NullPointerException){ modelAndView.addObject("error",e.toString()); modelAndView.setViewName("error1"); } return modelAndView; } }