统一异常处理

目录

一、全局异常处理

二、处理特定异常

三、自定义异常


当程序出现异常的时候,如果我们不加处理,或者直接抛出异常,那么相应给前端的就如下面这种提示信息,并且服务端控制台也会展示异常信息。非常不友好。

 我们希望,程序即使报错,也要返回一个统一的异常结果。

一、全局异常处理

创建统一异常处理器

/**
 * 统一异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result error(Exception e){
        e.printStackTrace();
        return Result.error("执行了全局异常处理了");
    }
}

这样程序抛出异常的时候,就会被该异常处理方法所捕获,并且返回统一异常处理的结果(JSON格式)!

二、处理特定异常

只需要在上述异常处理类中增加对应的方法

@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public Result error(ArithmeticException e){
	e.printStackTrace();
	return Result.error("执行了特定异常处理(算术异常)");
}

当程序如果遇到@ExceptionHandler()注解所标注的异常之后,就会调用该方法抛出异常。

假如程序抛出的指定异常类型没有在统一异常处理类中指定,那么就会被其父类异常Exception.class所捕获。执行对应的全局异常方法。

三、自定义异常

我们也可以自定义编写一个异常类型,然后加入到统一异常处理类中,不过在业务中需要的位置,需要我们自己抛出。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomException extends RuntimeException {
    private Integer code;
    private String msg;
}
try {
    int a = 10/0;
}catch(Exception e) {
    throw new CustomException(20001,"出现自定义异常");
}
@ExceptionHandler(CustomException.class)
@ResponseBody
public Result error(CustomException e){

	return Result.error(e.getMsg(),e.getCode());
}

四、其他相关问题解答

若程序中还引入了其他有关异常处理的依赖包,可能导致我们写的全局异常处理不生效

这大概率是spring的bean优先级问题。

在Java中,Spring框架提供了一种强大的机制,允许我们通过使用@Order注解来控制Bean的初始化顺序。这个注解主要用于解决依赖注入的问题,特别是在处理复杂的依赖关系时。

@Order标记定义了组件的加载顺序,值越小拥有越高的优先级,可为负数。

例如:

@Order(-1)优先于@Order(0)

@Order(1)优先于@Order(2)

根据实际情况,我们只需要将@Order()注解作用在全局异常处理的类上或者指定的方法上或者属性上即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot提供了一种简单而强大的方式来处理应用程序中的异常,即统一异常处理。通过统一异常处理,我们可以捕获和处理应用程序中的所有异常,并返回自定义的错误响应。 在Spring Boot中,我们可以使用@ControllerAdvice注解来定义一个全局的异常处理类。这个类可以包含多个异常处理方法,每个方法对应一个具体的异常类型。当应用程序中抛出对应的异常时,Spring Boot会自动调用相应的异常处理方法进行处理。 下面是一个简单的示例代码,演示了如何使用@ControllerAdvice来实现统一异常处理: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setMessage("Internal Server Error"); errorResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) { ErrorResponse errorResponse = new ErrorResponse(); errorResponse.setMessage("User Not Found"); errorResponse.setStatus(HttpStatus.NOT_FOUND.value()); return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND); } // 其他异常处理方法... } ``` 在上面的代码中,我们定义了两个异常处理方法:handleException和handleUserNotFoundException。handleException方法用于处理所有未被其他异常处理方法捕获的异常,而handleUserNotFoundException方法用于处理UserNotFoundException异常。 在每个异常处理方法中,我们可以根据具体的业务需求,创建一个自定义的错误响应对象,并将其封装在ResponseEntity中返回给客户端。这样,无论是哪种异常,都可以得到统一的错误响应。 需要注意的是,为了使统一异常处理生效,我们还需要在应用程序的配置类上添加@EnableWebMvc注解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何苏三月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值