全局捕獲異常,很明顯的錯誤404返回給客戶,很不好呀。整個web請求項目全局捕獲異常,比如空指針直接返回給客戶啊,那多操蛋呀~
看這幾個常用的注解:
@ExceptionHandler 表示攔截異常
- @ControllerAdvice 是 controller 的一個輔助類,最常用的就是作為全局異常處理的切面類
- @ControllerAdvice 可以指定掃描范圍
- @ControllerAdvice 約定了幾種可行的返回值,如果是直接返回 model 類的話,需要使用 @ResponseBody 進行 json 轉換
- 返回 String,表示跳到某個 view
- 返回 modelAndView
- 返回 model + @ResponseBody
創建meven工程。pom:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ErrorCatch</groupId> <artifactId>com.toov5.ErrorCatch</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
Java類
package com.toov5.ErrorCatch; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController //以后經常做為服務異常捕獲,要經常用到這個注解 public class ErrorCatch { @RequestMapping("/getUser") public String getUser(int i ){ int j = 1/i; return "返回"+j; } }
項目目錄結構:
啟動,訪問:
圖2丑陋的頁面出來了,用戶體驗很瞎眼(這算是個用戶體驗哈)~~
解決方案1: try catch
public class ErrorCatch { @RequestMapping("/getUser") public String getUser(int i ){ int j = 0; try { j = 1/i; } catch (Exception e) { return "不好意思啊客戶!~"; } return "返回"+j; } }
如果每個錯誤,都要這樣。。。。。那不蛋疼了啊~開發可要累死了
解決方案二 全局捕獲異常
使用aop技術,采用異常通知
Spring Boot提供了支持,
首先建立一個類型,專門用來處理異常的
廢話不多說,實戰!
首先創建一個包 error(用來放異常捕獲類的)
然后創建異常捕獲類:
1、返回json格式
2、返回頁面
首先創建類:
package com.toov5.error; import java.util.HashMap; import java.util.Map; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice(basePackages="com.toov5.ErrorCatch") //SpringBoot的異常切入點。此包下的包攬了哈 public class GlobalException { @ResponseBody //返回jsoon給客戶端 public Map<String, Object> exceptionHandler(){ Map<String, Object> map = new HashMap<String, Object>(); map.put("errorCode", "666"); map.put("errorMsg", "不好意思啊"); return map; } }
@ExceptionHandler(RuntimeException.class) 這個注解表示運行時異常
注意 原java類文件去掉try catch
package com.toov5.ErrorCatch; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController //以后經常做微服務異常捕獲,要經常用到這個注解 public class ErrorCatch { @RequestMapping("/getUser") public String getUser(int i ){ int j = 1/i; return "返回"+j; } }
小伙伴們注意了啊~~~
我在給大家寫教程時候,發現了一個小問題,初學者們要注意了哦~!
@controlleradvice注解不起作用,Spring要掃描到!我這里的之前的目錄結構不更改的前提下:
應該這樣:
一定要把
GlobalException這個類掃到呀!!!
重啟后,訪問:
