您好,登錄后才能下訂單哦!
本篇內容主要講解“SpringBoot全局異常處理的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringBoot全局異常處理的使用方法”吧!
首先得搭建一個 web 應用才有可能繼續后續的測試,借助 SpringBoot 搭建一個 web 應用屬于比較簡單的活;
創建一個 maven 項目,pom 文件如下
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7</version> <relativePath/> <!-- lookup parent from update --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.45</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </pluginManagement> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
依然是一般的流程,pom 依賴搞定之后,寫一個程序入口
/** * Created by @author yihui in 15:26 19/9/13. */ @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } }
我們通常利用@ControllerAdvice
配合注解@ExceptionHandler
來實現全局異常捕獲處理
@ControllerAdvice
為所有的 Controller 織入增強方法
@ExceptionHandler
標記在方法上,表示當出現對應的異常拋出到上層時(即沒有被業務捕獲),這個方法會被觸發
下面我們通過實例進行功能演示
我們定義兩個異常捕獲的 case,一個是除 0,一個是數組越界異常
@Slf4j @ControllerAdvice public class GlobalExceptionHandler { public static String getThrowableStackInfo(Throwable e) { ByteArrayOutputStream buf = new ByteArrayOutputStream(); e.printStackTrace(new java.io.PrintWriter(buf, true)); String msg = buf.toString(); try { buf.close(); } catch (Exception t) { return e.getMessage(); } return msg; } @ResponseBody @ExceptionHandler(value = ArithmeticException.class) public String handleArithmetic(HttpServletRequest request, HttpServletResponse response, ArithmeticException e) throws IOException { log.info("divide error!"); return "divide 0: " + getThrowableStackInfo(e); } @ResponseBody @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class) public String handleArrayIndexOutBounds(HttpServletRequest request, HttpServletResponse response, ArrayIndexOutOfBoundsException e) throws IOException { log.info("array index out error!"); return "aryIndexOutOfBounds: " + getThrowableStackInfo(e); } }
在上面的測試中,我們將異常堆棧返回調用方
增加幾個測試方法
@Controller @RequestMapping(path = "page") public class ErrorPageRest { @ResponseBody @GetMapping(path = "divide") public int divide(int sub) { return 1000 / sub; } private int[] ans = new int[]{1, 2, 3, 4}; @ResponseBody @GetMapping(path = "ary") public int ary(int index) { return ans[index]; } }
實例測試如下,上面我們聲明捕獲的兩種異常被攔截并輸出對應的堆棧信息;
但是需要注意
404 和未捕獲的 500 異常則顯示的 SpringBoot 默認的錯誤頁面;
此外我們捕獲返回的 http 狀態碼是 200
上面的 case 中捕獲的異常返回的狀態碼是 200,但是在某些 case 中,可能更希望返回更合適的 http 狀態碼,此時可以使用ResponseStatus
來指定
使用方式比較簡單,加一個注解即可
@ResponseBody @ExceptionHandler(value = ArithmeticException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public String handleArithmetic(HttpServletRequest request, HttpServletResponse response, ArithmeticException e) throws IOException { log.info("divide error!"); return "divide 0: " + getThrowableStackInfo(e); }
通過@ControllerAdvice
配合@ExceptionHandler
可以攔截 500 異常,如果我希望 404 異常也可以攔截,可以如何處理?
首先修改配置文件application.properties
,將NoHandlerFoundException
拋出來
# 出現錯誤時, 直接拋出異常 spring.mvc.throw-exception-if-no-handler-found=true # 設置靜態資源映射訪問路徑,下面兩個二選一, spring.mvc.static-path-pattern=/statics/** # spring.resources.add-mappings=false
其次是定義異常捕獲
@ResponseBody @ExceptionHandler(value = NoHandlerFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public String handleNoHandlerError(NoHandlerFoundException e, HttpServletResponse response) { return "noHandlerFound: " + getThrowableStackInfo(e); }
再次測試如下,404 被我們捕獲并返回堆棧信息
到此,相信大家對“SpringBoot全局異常處理的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。