springboot專案中的異常處理
自定義錯誤頁面
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 的實現類,查原始碼。
相關文章
- SpringBoot中異常處理Spring Boot
- SpringBoot中的全域性異常處理Spring Boot
- SpringBoot專案中遇到的異常Spring Boot
- 聊聊springboot專案全域性異常處理那些事兒Spring Boot
- SpringBoot專案實戰(7):自定義異常處理介面Spring Boot
- springboot全域性異常處理Spring Boot
- SpringBoot統一異常處理Spring Boot
- springboot下新增全域性異常處理和自定義異常處理Spring Boot
- SpringBoot之全域性異常處理Spring Boot
- 【SpringBoot】全域性異常處理@ControllerAdviceSpring BootController
- SpringBoot優雅的全域性異常處理Spring Boot
- springboot統一異常處理及返回資料的處理Spring Boot
- SpringBoot實現統一異常處理Spring Boot
- SpringBoot處理全域性統一異常Spring Boot
- SpringBoot原始碼解析-ExceptionHandler處理異常的原理Spring Boot原始碼Exception
- 在大型軟體專案中如何處理錯誤和異常
- Ruby中的TypeError異常處理Error
- Springboot專案啟動異常排查Spring Boot
- 異常的處理
- SpringBoot 實戰 (十四) | 統一處理異常Spring Boot
- SpringBoot系列——自定義統一異常處理Spring Boot
- SpringBoot部落格開發之異常處理Spring Boot
- 異常-throws的方式處理異常
- 異常篇——異常處理
- SpringBoot進行優雅的全域性異常處理Spring Boot
- spring中的統一異常處理Spring
- python異常處理中finally的作用Python
- gRPC 中的異常該如何處理?RPC
- Java 中的異常處理機制Java
- 異常處理
- Kotlin DSL C++專案引入OpenCV異常處理(轉)KotlinC++OpenCV
- SpringBoot第十四篇:統一異常處理Spring Boot
- SpringBoot中SpringSecurity 中不能丟擲異常UserNameNotFoundException 問題解析與處理Spring BootGseException
- JSP 異常處理如何處理?JS
- C#中的異常處理機制C#
- Java中的異常處理最佳實踐Java
- React 異常處理React
- JS異常處理JS