springboot專案中的異常處理

unix_sky發表於2020-11-17

自定義錯誤頁面

SpringBoot 預設的處理異常的機制:SpringBoot 預設的已經提供了一套處理異常的機制。一旦程式中出現了異常 SpringBoot 會像/error 的 url 傳送請求。在 springBoot 中提供了一個叫 BasicExceptionController 來處理/error 請求,然後跳轉到預設顯示異常的頁面來展
在這裡插入圖片描述
如 果 我 們 需 要 將 所 有 的 異 常 同 一 跳 轉 到 自 定 義 的 錯 誤 頁 面 , 需 要 在src/main/resources/templates 目錄下建立 error.html 頁面。注意:名稱必須叫 error
在這裡插入圖片描述

依賴配置 ,需要整合thymeleaf,否則html不生效

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>

處理方式一:@ExceptionHandler 處理

@Controller
public class TestfController {
    @RequestMapping("/show1")
    public String showInfo1(){
        String msg = null;
        msg.length(); // NullPointerException
        return "success";
    }
    @RequestMapping("/show2")
    public String showInfo2(){
        int i = 0;
        int b = 100;
        System.out.println(b/i); // ArithmeicExpetion
        return "success";
    }
    @ExceptionHandler(value = {NullPointerException.class})
    public ModelAndView nullPointerExceptionHand(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error1");
        return  mv;
    }
    @ExceptionHandler(value = {ArithmeticException.class})
    public ModelAndView arithmeticExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",e.toString());
        mv.setViewName("error2");
        return mv;
    }
}

頁面

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>系統錯誤頁面....空指標</h1>
    <span th:text="${error}"></span>
</body>
</html>

在這裡插入圖片描述

這種處理只能對所在類中的異常進行處理,不是全域性異常處理,且業務程式碼和異常處理耦合性高。

處理方式二:@ControllerAdvice+@ExceptionHandler


@ControllerAdvice
public class GlobalException {
    /**
     * 如果當前類中出現了NullPointerException異常就會跳轉到本方法對應的view中
     * @return
     */
    @ExceptionHandler(value = {NullPointerException.class})
    public ModelAndView nullPointerExceptionHandler(Exception e){
        ModelAndView view = new ModelAndView();
        view.addObject("error",e.toString());
        view.setViewName("error1");
        return view;
    }

    /**
     * 如果當前類中出現了ArithmeticException異常就會跳轉到本方法對應的view中
     * @return
     */
    @ExceptionHandler(value = {ArithmeticException.class})
    public ModelAndView arithmeticExceptionHandler(Exception e){
        ModelAndView view = new ModelAndView();
        view.addObject("error",e.toString());
        view.setViewName("error2");
        return view;
    }
}

該處理方式為全域性異常處理,且解耦

處理方式三:SimpleMappingExceptionResolver

 通過系統提供的異常對映處理實現
 我們還可以通過SimpleMappingExceptionResolver將具體的異常和錯誤頁面指定對應關係,這樣就不用每個異常都單獨寫一個方法了。
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
        SimpleMappingExceptionResolver mapping = new SimpleMappingExceptionResolver();
        Properties properties = new Properties();
        properties.setProperty("java.lang.NullPointerException","error1");
        properties.setProperty("java.lang.ArithmeticException","error1");
        mapping.setExceptionMappings(properties);
        return mapping;
    }
}

全域性處理。

處理方式四:自定義HandlerExceptionResolver處理

通過實現HandlerExceptionResolver 介面來根據不同異常型別來動態處理異常。

/**
 * 通過實現HandlerExceptionResolver 來自定義全域性異常
 * 
 */
@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        System.out.println("全域性的自定義異常處理觸發了....");
        ModelAndView mv = new ModelAndView();
        if(e instanceof NullPointerException){
            mv.setViewName("error1");
            mv.addObject("error","空指標");
        }
        if(e instanceof  ArithmeticException){
            mv.setViewName("error2");
            mv.addObject("error","算數異常");
        }
        return mv;
    }
}

SimpleMappingExceptionResolver 也是 HandlerExceptionResolver 的實現類,查原始碼。

相關文章