一、前言
在开发过程中,我们经常会遇到异常,不管是DAO、SERVICE、Controller那一层都有可能发生,对于异常处理,正常同时是try-catch或者直接throw出去不管了
,这就导致了代码中四处散落着try-catch的代码,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。
那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?------答案是肯定的。全局异常处理机制
二、SpringBoot全局异常处理方式
正常的Web应用开发时,需要考虑到应用运行发生异常时或出现错误时如何来被处理,例如捕获必要的异常信息,记录日志方便日后排错,友好的用户响应输出等等.而应用程序发生错误,有可能是应用自身的问题,也有可能是客户端操作的问题.在我们的项目中全局异常处理非常重要。
大概有三种异常情况:
1.在进入Controller之前,譬如请求一个不存在的地址404错误;
2.在执行@RequestMapping时,进入逻辑处理阶段前,譬如传的参数类型错误;
3.以上都正常时,在controller里执行逻辑代码时出的异常,比如出现NullPointerException。
三、实现步骤
SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler
注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。
1.添加依赖
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.创建响应枚举类
提前创建好一个枚举类,这里面定义两个属性,分别是 code 和 msg ,然后再定义多个成功与异常标识的常量,这样来简化开发中多个地方都要输入重复的异常信息的问题。
package com.example.exceptionhandledemo.custom;
/**
* 自定义全局异常枚举
* @author qzz
*/
public enum GlobalErrorCodeEnum {
/**
* 未知异常
*/
SUCCESS("200","成功!"),
ERROR("400","失败!"),
BODY_NOT_MATCH("401","请求的数据格式不符!"),
SIGN_NOT_MACTH("403","请求的数字签名不匹配!"),
NOT_FOUND("404","未找到该资源!"),
SERVER_ERROR("500","服务器内部错误!"),
SERVER_BUSY("503","服务器正忙,请稍后再试!")
;
private String code;
private String msg;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
GlobalErrorCodeEnum(String code, String msg){
this.code = code;
this.msg=msg;
}
}
3.自定义异常类
创建一个自定义异常类,继承RuntimeException:
package com.example.exceptionhandledemo.custom;
import lombok