SpringBoot全局异常处理的使用方法
本篇内容主要讲解"SpringBoot全局异常处理的使用方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot全局异常处理的使用方法"吧!
I. 环境搭建
首先得搭建一个 web 应用才有可能继续后续的测试,借助 SpringBoot 搭建一个 web 应用属于比较简单的活;
创建一个 maven 项目,pom 文件如下
org.springframework.boot spring-boot-starter-parent 2.1.7 UTF-8 UTF-8 Finchley.RELEASE 1.8 org.springframework.boot spring-boot-starter-web com.alibaba fastjson 1.2.45 org.springframework.boot spring-boot-maven-plugin spring-milestones Spring Milestones https://repo.spring.io/milestone false
依然是一般的流程,pom 依赖搞定之后,写一个程序入口
/** * Created by @author yihui in 15:26 19/9/13. */@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class); }}II. 异常处理
1. @ControllerAdvice
我们通常利用@ControllerAdvice配合注解@ExceptionHandler来实现全局异常捕获处理
@ControllerAdvice为所有的 Controller 织入增强方法@ExceptionHandler标记在方法上,表示当出现对应的异常抛出到上层时(即没有被业务捕获),这个方法会被触发
下面我们通过实例进行功能演示
a. 异常捕获
我们定义两个异常捕获的 case,一个是除 0,一个是数组越界异常
@Slf4j@ControllerAdvicepublic 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); }}在上面的测试中,我们将异常堆栈返回调用方
b. 示例服务
增加几个测试方法
@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]; }}c. 测试说明
实例测试如下,上面我们声明捕获的两种异常被拦截并输出对应的堆栈信息;
但是需要注意
404 和未捕获的 500 异常则显示的 SpringBoot 默认的错误页面;
此外我们捕获返回的 http 状态码是 200
2. @ResponseStatus
上面的 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);}3. 404 处理
通过@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全局异常处理的使用方法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!