文章目录
- 前言
- @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类
用法很简单:
- 类上加
@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