SpringBoot 全局异常处理

全局异常处理

全局异常处理

自定义异常

创建自定义异常类,并继承Exception或者RunTimeException类,并重写相关方法。

/**
 * @author 居無何
 * date: 2022/2/28 20:28
 * Description: 信息更新时出现的未知异常
 * 注:ServiceException也是自定义异常类也是继承自RunTimeException。
 */
public class UpdateException extends ServiceException{
    public UpdateException() {
        super();
    }

    public UpdateException(String message) {
        super(message);
    }

    public UpdateException(String message, Throwable cause) {
        super(message, cause);
    }

    public UpdateException(Throwable cause) {
        super(cause);
    }

    protected UpdateException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

捕获全局异常

  1. 创建处理全局异常的类
  2. 通过注解**@ControllerAdvice和@ExceptionHandler **标记该类为全局处理异常类和捕获各个不同类型的异常。
/**
 * @author 居無何
 * date: 2022/2/23 17:19
 * Description: 统一捕获controller层的异常
 */
@ControllerAdvice
public class BaseController {
	
	/**
	* @ControllerAdvice-标记该类为处理全局异常的类。
	* @ExceptionHandler(ServiceException.class)-捕获指定的异常。
	*/
	
    @ResponseBody
    @ExceptionHandler(ServiceException.class)
    public JsonResult<Void> ControllerException (Throwable e){
        JsonResult jsonDesign = new JsonResult();
        if (e instanceof UserNameOccupyException){
            jsonDesign.setStatus(3050);
            jsonDesign.setDescription("出现未知错误,数据更新失败!");
        }
        return jsonDesign;
    }

}

手动异常抛出

根据具体的项目实际情况抛出异常,这里就采用主方法演示。

public class Test {

    public static void main(String[] args) {

		//手动抛出异常
        throw new UpdateException("未知错误,数据更新失败!");

    }
}

枚举异常处理

该方式与上一种方法相比较,使用枚举异常处理的方式可以减少类的创建。

创建枚举类

public enum ExceptionEnum {

    UpdateException(3050,"遇到未知错误,数据更新失败!");

	//响应代码
    private int code;
	//响应的消息
    private String message;

    ExceptionEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

创建自定义异常

创建自定义异常,继承RunTimeException。

public class GlobalException extends RuntimeException{
	
    private ExceptionEnum exceptionEnum;

    public GlobalException(ExceptionEnum exceptionEnum) {
        this.exceptionEnum = exceptionEnum;
    }

    public ExceptionEnum getExceptionEnum() {
        return exceptionEnum;
    }

}

捕获全局异常

@ControllerAdvice
public class GlobalExceptionController {

    @ExceptionHandler(GlobalException.class)
    public JsonResult<Void> ControllerException(GlobalException e){
        JsonResult jsonDesign = new JsonResult();
        
        //code
        jsonDesign.setStatus(e.getExceptionEnum().getCode());
        //详细消息
        jsonDesign.setDescription(e.getExceptionEnum().getMessage());
        return jsonDesign;
    }
}

手动抛出异常

throw new GlobalException(ExceptionEnum.UpdateException);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
@ExceptionHandler注解是用来定义具体的异常处理方法的,用法是在Controller层中的任意一个方法上使用该注解,当该方法中抛出对应的异常时,就会执行对应的处理方法。 @ControllerAdvice注解是一个全局异常处理器,可以用来统一处理所有Controller层中抛出的异常,它可以定义一个或多个@ExceptionHandler方法,用来捕获不同的异常并进行统一处理。 而枚举实现全局异常统一处理可以通过定义一个枚举类来实现,每个枚举值代表一种错误类型,包括错误码和错误信息。在@ControllerAdvice中,可以定义一个@ExceptionHandler方法,在该方法中根据不同的异常类型和错误码返回对应的错误信息。这样,当有异常抛出时,就会根据所对应的错误类型和错误码返回对应的错误信息。 例如: ``` @RequiredArgsConstructor @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = BusinessException.class) @ResponseBody public ApiResponse handleBusinessException(BusinessException e) { return ApiResponse.fail(e.getErrorCode(), e.getMessage()); } } @AllArgsConstructor @Getter public enum ErrorCode { SUCCESS("00000", "操作成功"), UNKNOWN_ERROR("-1", "系统繁忙,请稍后再试"),; private String code; private String message; } ``` 在上面的代码中,我们定义了一个枚举类ErrorCode,它包含了成功和未知错误两种类型的错误码和错误信息。我们在GlobalExceptionHandler类中定义了一个handleBusinessException方法,用来处理BusinessException异常,该方法返回一个ApiResponse对象,其中使用了e.getErrorCode()和e.getMessage()方法获取异常的错误码和错误信息,并返回给前端。 如此一来,我们就可以实现全局异常统一处理,并且在ApiException和BusinessException中添加对应的错误码和错误信息,方便日后维护和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值