基于Spring Boot的统一异常处理设计

作者: Grey

原文地址:https://www.cnblogs.com/greyzeng/p/11733327.html

Spring Boot中,支持RestControllerAdvice统一处理异常,在一个请求响应周期当中,如果Controller,Service,Repository出现任何异常,都会被RestControllerAdvice机制所捕获,进行统一处理。

进行统一异常处理的目的也就是为了将千奇百怪的异常信息转换成用户可识别的错误信息

统一异常拦截器

@RestControllerAdvice
@Slf4j
public class GlobalExceptionTranslator { }

系统中的两类异常处理

第一类:业务自定义的异常,遇到这种异常,拦截器记录后,将业务异常自己的信息抛出。

@ExceptionHandler(BusinessException.class)
public JSONObject handleError(BusinessException e) {
log.error("Business Exception {}", getStackTraceAsString(e));
return error(e);
}

第二类:未定义异常,拦截器负责统一屏蔽原来的异常信息,转为服务器内部异常抛出。

@ExceptionHandler(Throwable.class)
public JSONObject handleError(Throwable undefined) {
log.error("Internal Server Error {}", getStackTraceAsString(undefined));
return error(new BusinessException(FAILURE));
}

调用者收到error的结果后,直接显示msg内容为用户可见的错误信息即可。

如何自定义一个业务异常

在业务开发中,通常无需进行Try catch处理,有业务异常直接抛出即可。如果需要定义一类通用的异常,则需要在自己业务模块下新建异常类,继承于 BusinessException


public class PaymentException extends BusinessException { //重写构造函数,从而定义该自定义异常的用户可见的错误信息
public PaymentException() {
super("支付失败"); }
}

如何自定义一个框架级异常

在系统框架层面,已经预定义了一些常见的异常类,如:

类名 定义 预置错误信息
PermissionDenyException 用户访问未授权的内容 权限不足
ServiceNotFoundException 调用微服务失败 调用相关服务失败
其他异常 ... ...

在定义框架级异常时,除了需要编写异常类之外,如需要前端根据error CODE做对应的处理,就可以在ResultCode中增加定义。示例如下:

@Getter
@AllArgsConstructor
public enum ResultCode { /**
* 操作成功
*/
SUCCESS(HTTP_OK, "操作成功"),
/**
* 因程序内部错误操作失败(如不指定,则默认这个异常)
*/
FAILURE(HTTP_INTERNAL_ERROR, "系统运行异常,请联系管理员"),
/**
* 用户访问未授权的内容
*/
UN_AUTHORIZED(HTTP_UNAUTHORIZED, "权限不足"), /**
* 调用微服务失败
*/
NOT_FOUND(HTTP_NOT_FOUND, "调用相关服务失败"); final int code; final String msg;
}

一个框架级异常的实现类


public class PermissionDenyException extends BusinessException {
public PermissionDenyException() {
super(UN_AUTHORIZED);
}
}

如需要框架对该异常定义统一的策略,则需要在GlobalExceptionTranslator实现该策略,示例如下:

public class GlobalExceptionTranslator {
@ExceptionHandler(NewGlobalException.class)
public JSONObject handleError(NewGlobalException e) {
// 这里可以实现自定义的异常策略
return error(new BusinessException(e.getResultCode(),e.getMessage()));
}
}

基于Spring Boot的统一异常处理设计的更多相关文章

  1. 基于spring boot的统一异常处理

    一.springboot的默认异常处理 Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容. 例如这里我 ...

  2. spring boot 中统一异常处理

    基于 spring boot 对异常处理的不友好,现在通过其他的方式来统一处理异常 步骤一:自定义异常类 public class UserNotExistException extends Runt ...

  3. spring boot配置统一异常处理

    基于@ControllerAdvice的统一异常处理 >.这里ServerException是我自定义的异常,和普通Exception分开处理 >.这里的RequestResult是我自定 ...

  4. Spring Boot实践——统一异常处理

    注解说明 @ControllerAdvice,是Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强.让我们先看看@ControllerAdvice的实现: /** * Special ...

  5. Spring Boot学习——统一异常处理

    本随笔记录使用Spring Boot统一处理异常. 本文实例是从数据库中根据ID查询学生信息,要求学生的年龄在14——20岁之间.小于14岁,提示“你可能在上初中”:大于20岁,提示“呢可能在上大学” ...

  6. 【Spring Boot】Spring Boot之统一异常处理

    一.统一异常处理的作用 在web应用中,请求处理时,出现异常是非常常见的.所以当应用出现各类异常时,进行异常的统一捕获或者二次处理(比如空指针异常或sql异常正常是不能外抛)是非常必要的,然后右统一异 ...

  7. spring boot 2 统一异常处理

    spring mvc 针对controller层异常统一处理非常简单,使用 @RestControllerAdvice 或 @RestControllerAdvice 注解就可以轻@RestContr ...

  8. 基于Spring Boot的在线问卷调查系统的设计与实现+论文

    全部源码下载 # 基于Spring Boot的问卷调查系统 ## 介绍 > * 本项目的在线问卷调查调查系统是基于Spring Boot 开发的,采用了前后端分离模式来开发. > * 前端 ...

  9. 基于Spring Boot和Spring Cloud实现微服务架构学习

    转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...

随机推荐

  1. 激光三角测量(sheet of light)halcon示例详解 Reconstruct_Connection_Rod_Calib.hdev 三维重建

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11555100.html 前言:最近项目用到halcon的3d模板匹配,三维重建,相机标定,所以 ...

  2. Netty源码分析 (十)----- 拆包器之LineBasedFrameDecoder

    Netty 自带多个粘包拆包解码器.今天介绍 LineBasedFrameDecoder,换行符解码器. 行拆包器 下面,以一个具体的例子来看看业netty自带的拆包器是如何来拆包的 这个类叫做 Li ...

  3. Python3 爬虫之 Scrapy 框架安装配置(一)

    博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的爬虫实现过程请参照本人的另一篇博客:Python3 爬虫之 Scr ...

  4. Android开发中常用Dialog(普通弹窗&时间选择器&日历选择器)

    引言 开发中,我们会有很多地方使用 Dialog 来展示一些提示信息或设置信息.如:用户提示.进度展示.时间设置.日期设置等. 下面我和大家一些学习下Android中常用的几种Dialog吧~ * 首 ...

  5. 《JavaScript DOM 编程艺术》 学习笔记

    目录 <JavaScript DOM 编程艺术> 学习笔记 第一章 js简史 第二章 js语法 准备工作 语法 第三章 DOM DOM中的D DOM中的O DOM中的M 第四章 js图片库 ...

  6. 离线环境下进行pip包安装

    内网服务器不能上网,但是需要在上面安装python-package 通过另外一台能上网的主机B 1. 下载需要离线安装的Packages 在B上执行如下命令: 安装单个Package $ pip in ...

  7. [C++] 访问控制与继承详解

      1.访问控制中有三种角色:基类及其友元,派生类,类用户(对象):访问说明符分为public/protected/private,类的成员也相应的分为了3种.   2.访问说明符又分为两种:一个是基 ...

  8. Centos7 快速安装Docker

    写在前面 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以轻松批量地在生产环境中部署. 网上的安装教程也很多这里我推 ...

  9. 项目管理知识点-结合Enovia项目管理模块

    核心知识域:整体管理.范围管理.进度管理.成本管理.质量管理.信息安全管理 保障域:人力资源管理.合同管理.采购管理.风险管理.信息(文档)管理.配置管理.知识产权管理.法律法规标准规范管理.职业道德 ...

  10. poj-2232 New Stone-Forfex-Cloth Game 思维题

    Acm is a clever boy, and he developed a new game form the old Stone-Forfex-Cloth game. In this game, ...