任何系统,我们不会傻傻的在每一个地方进行异常捕获和处理,整个系统一般我们会在一个的地方统一进行异常处理,spring boot全局异常处理很简单;
介绍前先说点题外话,我们现在开发系统,都是前后端完全分离的,后端只提供restfull api,禁止涉及任何界面,什么thymeleaf、jsp那些后端模板,是绝对禁止使用的,那些东西请扔垃圾箱,不要浪费大好青春去研究,那是堕落;前端则负责界面相关,常用vue;如果公司还没前后端分离,还在thymeleaf还在前后端一起写,那你还是早做跳槽打算吧,他们养不起你,更养不起你的家人;
前后端分离,后端api,一般对于异常处理,要做得无非两件事,
1是记录日志及相应通知处理,这是对内的,
2是给出返回结果给api调用者,这是对外的;
对api调用者来说,他只需要一个返回结果(包含错误代码、提示信息),其他的他不关心
对后端来说,他只需要记录日志,通知或者给发布相应消息给其他队列处理相关事项;
我们应该认识到,一切异常,对系统来说,都是不正常的表现,都是属于缺陷,都属于bug,尽管有些异常是我们主动抛出的;
我们要做的,是应该尽量提高系统可用性,最大限度避免任何异常的出现,而不是去指望完善异常处理来完善系统;
异常处理,是异常无法避免的出现了而采取的一种应急措施,主要目的是对外增加友好性,对内提供补救线索;
不要认为完善的异常处理是系统核心,他不是,不要指望异常处理尽善尽美,不要指望异常处理来给系统缺陷擦屁股;
如果系统异常过多,那么你要做的不是去完善异常处理机制,而是要好好去反思:系统架构设计是否合理,系统逻辑设计是否合理;
使用@controlleradvice、@exceptionhandler注解封装一个异常处理类即可
package com.anson.common.exception; import com.anson.common.result.resultbody; import com.anson.common.result.resultcode; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.web.bind.annotation.controlleradvice; import org.springframework.web.bind.annotation.exceptionhandler; import org.springframework.web.bind.annotation.responsebody; /** * @description: 全局异常处理类 * @author: anson * @date: 2019/12/17 20:56 */ @controlleradvice public class globalexceptionhandler { private static final logger logger = loggerfactory.getlogger(globalexceptionhandler.class); /** * 所有异常处理 * @param e * @return */ @exceptionhandler(value =exception.class) @responsebody public resultbody exceptionhandler(exception e) { //1、写日志及其他处理,对内 logger.error("未知异常!原因是:",e); system.out.println("未知异常!原因是:"+e); //2、返回错误识别码和提示给api调用者、对外 return resultbody.failed(resultcode.failed); } }
这样就可以了,
resultbody、resultcode这个我们下节会说到;
如对本文有疑问, 点击进行留言回复!!
网友评论