全局异常统一处理

全局异常统一处理

引言

以前使用的传统的Try-Catch语句,可能存在大量的重复代码和不一致性问题。

此外抛出未处理的异常时,用户会看到系统生成的默认错误页面,用户体验较差。

而使用全局异常统一处理后就有了以下优点:

  1. 减少代码冗余
  2. 提高代码可维护性
  3. 统一异常处理策略
  4. 自定义异常处理
  5. 提升用户体验
  6. 增强安全性
  7. 符合RESTful API设计原则
  8. 方便日志记录

使用方式:

第一步: 自定义异常类(也可以不自定义,比如统一针对JDK已有异常做处理)

/**
 * 自定义运行时异常基类
 */
public class BaseException extends RuntimeException {

    public BaseException() {
    }

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

第二步:编写统一异常处理类,统一捕获处理返回

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器,处理项目中抛出的运行时异常
 */
//此注解用来指定该类是异常处理类
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        //自定义公共返回结果类
        return Result.error(ex.getMessage());
    }
}

以上出现注解的详细解释

  • @RestControllerAdvice注解主要用于Spring MVC和Spring Boot应用程序中,以定义全局异常处理类。

    • @RestControllerAdvice是一个组合注解,由@ControllerAdvice@ResponseBody组成。

    • @ControllerAdvice本身继承了@Component,因此@RestControllerAdvice本质上也是一个Component。

    • @RestControllerAdvice用于定义@ExceptionHandler@InitBinder@ModelAttribute方法,这些方法适用于所有使用@RequestMapping注解的方法。

    • 它允许开发者以集中的方式处理整个应用程序的异常,当应用程序中的任何控制器方法抛出异常时,@RestControllerAdvice注解所标注的类可以拦截并处理这些异常。

  • @ExceptionHandler注解用于处理整个应用程序中抛出的异常

  1. 指定异常类型
    @ExceptionHandler注解可以指定一个或多个要处理的异常类型。当这些类型的异常被抛出时,Spring MVC会自动调用对应的@ExceptionHandler方法。

    @ExceptionHandler(NullPointerException.class)  
    public String handleNullPointerException(NullPointerException ex) {  
        // 处理NullPointerException的逻辑  
        return "errorPage";  
    }
    

    如果不指定异常类型,则@ExceptionHandler方法将尝试处理所有抛出的异常(但通常不建议这样做,因为它可能导致意外的行为)。

  2. 处理异常
    @ExceptionHandler方法可以接受一个或多个参数,其中最常用的是异常对象本身。通过该参数,开发者可以访问异常的详细信息,如异常消息、堆栈跟踪等。

    @ExceptionHandler  
    public ResponseEntity<String> handleAllExceptions(Exception ex) {  
        // 处理所有异常的逻辑  
        return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);  
    }
    
  3. 返回类型
    @ExceptionHandler方法的返回类型可以是任意类型,但通常建议返回与控制器方法相同的类型,以保持API的一致性。

好的,您想了解关于使用 @ExceptionHandler + @ControllerAdvice +枚举实现全局异常统一处理的内容,这是一个常用的方案,可以实现全局异常的捕获和处理,让程序更加健壮和稳定。 @ExceptionHandler注解用于标记一个方法,该方法用于处理指定的异常类型。@ControllerAdvice注解用于标记一个类,该类用于处理全局异常。枚举则可以用于定义异常类型,方便异常处理时的统一管理。 在实现全局异常处理时,我们可以通过 @ExceptionHandler 注解来捕获指定的异常类型,并在方法中进行相应的处理。@ControllerAdvice注解可以让我们在一个类中定义多个 @ExceptionHandler方法,用于处理不同类型的异常。同时,我们也可以使用枚举来定义不同的异常类型,方便管理和调用。 下面是一个简单的示例,演示如何使用 @ExceptionHandler + @ControllerAdvice +枚举实现全局异常统一处理: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = BusinessException.class) @ResponseBody public ResultVO handleBusinessException(BusinessException e) { return ResultVO.error(e.getCode(), e.getMessage()); } } public enum ExceptionEnum { PARAMETER_ERROR(1001, "参数错误"), DATA_NOT_FOUND(1002, "数据不存在"), SYSTEM_ERROR(5000, "系统错误"); private final int code; private final String message; ExceptionEnum(int code, String message) { this.code = code; this.message = message; } public int getCode() { return code; } public String getMessage() { return message; } } public class BusinessException extends RuntimeException { private final int code; public BusinessException(int code, String message) { super(message); this.code = code; } public BusinessException(ExceptionEnum exceptionEnum) { super(exceptionEnum.getMessage()); this.code = exceptionEnum.getCode(); } public int getCode() { return code; } } ``` 在上面的示例中,GlobalExceptionHandler类标记了@ControllerAdvice注解,用于全局异常处理。其中,handleBusinessException方法用于处理BusinessException异常,返回一个ResultVO对象,其中包含错误码和错误信息。 BusinessException则是一个自定义的异常类,它包含一个code属性和一个message属性,用于表示异常的错误码和错误信息。同时,它还提供了一个构造方法,可以根据ExceptionEnum来构造一个BusinessException对象。 ExceptionEnum则是一个枚举类,包含了不同的异常类型,每个异常类型都有一个对应的错误码和错误信息。 在实际开发中,我们可以根据实际需求来定义不同的异常类型和错误码,以便更好地管理和调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值