全局异常捕获
什么是异常?程序在启动或者运行时没有按照预期的执行,在执行途中发生某种未知的错误,导致程序非正常停止或者报错。
在我们的程序中,肯定会伴随着很多的异常,启动时:空对象、找不到数据库、用户名密码不对等等异常,都会在程序启动时抛出异常信息,运行时:空引用、参数不匹配等等都会在程序运行时抛出异常,启动的时候抛出异常我们可以马上修改,但是程序正在运行的突然报了一个错,如果没有对这个错误做处理,用户可能会看到一堆的代码信息,很不友好,所以今天讲解一下springboot全局异常捕获。
我们先看一个程序没有做异常处理会发生什么事情,下面是一个小小的例子:
private static List list = new ArrayList(); static { list.add("小明"); list.add("小红"); list.add(null); } /** * 测试 * @return */ @GetMapping(value = "/test") public String test(){ for(String s: list){ if(s.equals("小红")){ log.info("听说点赞的都发财了!!!"); }else{ log.info("没点赞的好像也发财了!!!"); } } return "success"; }
这是一个典型的空指针异常,真正写代码的时候是不会这么干的,这里为了展示效果才这样写的,我们请求/test接口,看看会发生什么?
![d8e339a5604f7129577edfa0e392cbd4.png](https://img-blog.csdnimg.cn/img_convert/d8e339a5604f7129577edfa0e392cbd4.png)
我靠?这是什么玩意?这要是让用户/甲方爸爸看到,那还不得被骂死?那如何解决这个问题呢?
我们将for循环这段代码加try/catch异常捕获处理。
改造后的代码:
/** * 测试 * @return */ @GetMapping(value = "/test") public String test(){ try{ for(String s: list){ if(s.equals("小红")){ log.info("听说点赞的都发财了!!!"); }else{ log.info("没点赞的好像也发财了!!!"); } } }catch (Exception e){ return "网络繁忙,请稍后再试"; } return "success"; }
再次访问:
![b55bb78536d551d48eb0ef1ae457b049.png](https://img-blog.csdnimg.cn/img_convert/b55bb78536d551d48eb0ef1ae457b049.png)
发现已经不是提示代码信息了,而是提示了比较友好的网络繁忙,那这个时候,你可能就会有问题了,那我岂不是需要在每个接口请求中添加一个try/catch异常捕获?这样不仅让代码的可读性变差,还会牵扯到代码的可维护性,以后接手代码的同事心里可能是崩溃的。
![a73584bc142ddf099393fe73d6171bd2.png](https://img-blog.csdnimg.cn/img_convert/a73584bc142ddf099393fe73d6171bd2.png)
java有没有一种统一的处理方式呢?让特定的错误返回特定的提示,java这么强大,怎么可能没有?下面我们来讲讲如何实现springboot的全局异常捕获。
我们先定义一个全局异常捕获类:GlobalExceptionRespone,由于Exception是大部分异常的大哥大,所以我们针对Exception做一个异常处理
package com.ymy.exceptions;import com.ymy.utils.ConstantUtil;import com.ymy.vo.Result;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;@Slf4j@RestControllerAdvicepublic class GlobalExceptionRespone { /** * 全局异常捕获 * @param e * @return */ @Ex