Spring统一异常处理【原创】

作者: 风中凌乱的小潘 | 来源:发表于2019-05-15 17:04 被阅读47次


    场景:

    后台控制器抛出了异常,因为返回的不是标准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

    相关文章

      网友评论

        本文标题:Spring统一异常处理【原创】

        本文链接:https://www.haomeiwen.com/subject/iozuaqtx.html