全局异常统一处理

全局异常统一处理

引言

以前使用的传统的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的一致性。

Spring Boot Web开发中,全局异常统一处理机制是一项重要的技术,它能提升应用的稳定性和用户体验,还能提高开发效率。 从Spring Framework 3.2版本开始,Spring提供了`@ControllerAdvice`注解,可结合`@ExceptionHandler`注解实现全局异常的捕捉。`@ControllerAdvice`用于定义统一异常处理类,而非在每个`Controller`中逐个定义异常处理逻辑;`@ExceptionHandler`则用来定义函数针对的异常类型。从Spring Framework 4.3版本开始,又提供了`@RestControllerAdvice`注解,可简化`@ControllerAdvice`的声明工作 [^5]。 以下是一个处理全局异常的代码示例: ```python import com.example.demo.model.Result; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice @ResponseBody public class ErrorAdvice { /** * 全局异常处理 */ @ExceptionHandler public Object handler(Exception e) { return Result.fail(e.getMessage()); } } ``` 在这个示例中,`ErrorAdvice`类使用`@ControllerAdvice`和`@ResponseBody`注解,`@ExceptionHandler`注解的`handler`方法会捕获所有异常,并返回一个封装了错误信息的`Result`对象 [^3]。 此外,还可以将`Exception`对象和请求URL映射到`error.html`中。例如,以Web应用例子为基础,通过使用`@ControllerAdvice`定义统一异常处理类,最后将异常信息进行相应的映射处理 [^4]。 全局异常统一处理机制在Spring Boot的开发中经常被用到,它能使客户端接收到的响应更友好,避免未被捕捉的异常直接暴露给用户,同时也方便开发者对异常进行集中管理和处理 [^2][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值