场景:
后台控制器抛出了异常,因为返回的不是标准json格式,导致前端无法解析数据。如果直接将异常信息弹框显示会影响客户体验,但是不提示又无法快速定位问题,针对此场景引入了Spring的统一异常处理机制来对异常进行统一处理。
示例:
正确格式:
错误格式:
目的:
使得后端抛出异常的使其能按标准格式返回。
主要实现依据:
使用了@ControllerAdvice注解标识的类能捕获所有控制器抛出的异常
自定义异常类:
异常抛出类:所有的异常都用此类来抛出,避免service层频繁使用try{}catch处理异常、
异常捕获类:通过@ControllerAdvice,@ExceptionHandler(UserException.class)来实现所有被@Controller标识的类的指定异常的捕获
异常枚举类:定义所有可知异常
业务代码:通过统一的异常抛出类来进行异常抛出,异常统一在controller层进行处理。
效果:
思考:像这种枚举类定义的都是我们知道的异常,我们自己手动抛出的。可是我们在日常开发中的经验告诉我们,除了这种已知的由我们自己手动抛出的异常还有其他未知的异常。那这种异常又如何处理呢?
例如:org.springframework.http.converter.HttpMessageNotReadableException是SpringMVC抛出的参数转换时报出的异常,这种返回格式前端也是无法解析的。
解决:还是依赖于@ExceptionHandler(Exception.class)和@ControllerAdvice注解,通过静态代码块来完成已知异常put到map集合中,再将捕获到的异常进行比较,如果存在则按枚举类定义的进行返回,否则统一返回系统繁忙。
总结:
1、自定义异常类型。
2、自定义错误代码及错误信息。
3、对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。
可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
4、对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。
不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为RuntimeException类型(运行时异常)。
5、可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随请求响应给客户端。
参考:博学谷->统一异常处理
完整代码地址:https://github.com/hardpbl/allexception-handing.git
网友评论