1. 程式人生 > >springboot--異常處理

springboot--異常處理

目錄

SpringBoot中異常處理方式

SpringBoot預設的異常處理方式

自定義錯誤處理頁面

@ExceptionHandler處理異常

@[email protected]註解處理異常

配置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;
        }
    }