7.10 SpringBoot实战 全局异常处理

CSDN成就一亿技术人

文章目录

  • 前言
  • @RestControllerAdvice项目实战
  • 最后


前言

在一个项目中,异常处理 是你无法绕过去的话题!

不论你多牛逼,你写的代码都可能会出现异常,有的异常非常容易测试出来,但有的异常却需要在非常极端情况下才会出现,所以,异常真的不好对付!

曾几何时,你对自己的代码非常自信,并没想过做异常处理,然后就听说你的服务不稳定!时不时的报500服务器内部错误,这时你也摸不到头脑,什么情况?

然后,你静静一想:兵来将挡,水来土掩,见招拆招,这难不到我!所以,你做了一个非常”稳妥“的办法:在controller里给代码加上了try-catch,并打日志:

try {
   // 业务代码
    return TgResult.ok();
} catch(Exception ex) {
    // 不管任何异常,统统抓到打log,并返回统一结果
   log.error("异常了",ex);
   return TgResult.fail(。。。)
}

嘿嘿,这样什么异常就都跳不出我的五指山了,也不报500了,然后还可以根据异常log再去针对性优化代码!

但慢慢你发现,这个工作有点繁琐,controller里的方法try-catch处理都非常的类似,并且当扩展处理新异常时,一改就得改几十几百处,真是让人崩溃!

改着改着,忽然清风徐来,你隐约的想到,这么多相似的代码,这么相似的处理,是不是可以运用前面学过的过滤器、拦截器、AOP?

于是,你发动搜索大法,发现了SpringBoot为我们提供的全局异常处理的AOP实现:@RestControllerAdvice!


@RestControllerAdvice项目实战

你去掉了所有controller里加的try-catch,并新建了GlobalExceptionHandler类

7.10 SpringBoot实战 全局异常处理_第1张图片

用法很简单:

  • 类上加@RestControllerAdvice注解,相当于@ControllerAdvice + @ResponseBody,默认切面所有controller,当然也可以通过@ControllerAdvice注解中的一些属性选定符合条件的controller。
  • 增加要处理异常的方法,并增加@ExceptionHandler注解:指定要处理的异常

示例:

@RestControllerAdvice // 指定全局异常处理类
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class) // 指定要处理的异常为Exception
    public TgResult ExceptionHandler(Exception e){
        log.error("ExceptionHandler", e);
        return TgResult.fail("500", "操作失败:" + e.getMessage());
    }
}

实际就是将所有controller里加的try-catch,统一用AOP的方式写到了一个地方,这样,想处理什么异常,只要在这里增加@ExceptionHandler注解修饰的方法,就会对全部controller做切面处理异常了,是不是非常优雅?

当然,我这里处理的比较笼统,实际项目通常会分几个大类来处理相应的异常,并给出不同的处理方案!另外,对于未处理到的异常依然需要使用Exception兜底,那么,即使是Exception,我们也需要做细化,那么你知道具体怎么实现吗?

为了让你对这部分印象深刻,我这里暂不给出答案,你先自己思考和实践!不要想着从网上文章找答案,网上很多文章都是抄来抄去,只会讲到全局异常处理机制,并不会非常深入的讲如何实战!所以,好好思考,我会在下文给出答案!


最后

想要看更多实战好文章,还是给大家推荐我的实战专栏–>《基于SpringBoot+SpringCloud+Vue前后端分离项目实战》,由我和 前端狗哥 合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验!

具体的优势、规划、技术选型都可以在《开篇》试读!

订阅专栏后可以添加我的微信,我会为每一位用户进行针对性指导!

另外,别忘了关注我:天罡gg ,发布新文不容易错过: https://blog.csdn.net/scm_2008

你可能感兴趣的:(spring,boot,java,spring,全局异常处理,Exception,ControllerAdvic,ExceptionHandle)