返回

从本质出发,让异常处理机制可控且自如!

前端

剖析SpringMVC全局异常处理机制

全局异常处理的处理方式

SpringMVC中提供全局异常处理主要有如下两种方式:

  • 通过实现HandlerExceptionResolver接口来自定义异常处理器。

  • 通过@ControllerAdvice注解加@ExceptionHandler注解的方式来自定义异常处理器。

第一种方式:实现HandlerExceptionResolver接口来自定义异常处理器

当SpringMVC的DispatcherServlet检测到有异常抛出的时候, 会依次执行实现HandlerExceptionResolver接口的异常处理器。

public interface HandlerExceptionResolver {
    ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}

其中,resolveException()方法是异常处理器的核心方法, 它接收了请求和响应对象、处理程序和异常对象作为参数, 并返回一个ModelAndView对象。

ModelAndView对象包含了视图的名称和模型数据, SpringMVC会根据ModelAndView对象渲染视图并返回给浏览器。

第二种方式:通过@ControllerAdvice注解加@ExceptionHandler注解来自定义异常处理器

@ControllerAdvice注解是一个控制器增强注解, 它可以用来定义控制器的增强行为, 比如全局异常处理。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex, HttpServletRequest request, HttpServletResponse response) {
        // 处理异常的逻辑
        return new ModelAndView("error");
    }
}

当SpringMVC的DispatcherServlet检测到有异常抛出的时候, 会依次执行带有@ControllerAdvice注解的类的方法。

如果方法的参数列表中包含了异常类型, 那么该方法就会被用来处理该类型的异常。

完善SpringMVC全局异常处理机制

  • 实现自定义异常

通过实现RuntimeException接口来自定义异常, 这样可以方便地将自定义的异常信息传递给SpringMVC的异常处理机制。

public class MyException extends RuntimeException {
    private String message;

    public MyException(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
  • 指定不同的异常处理器

通过实现HandlerExceptionResolver接口或者使用@ControllerAdvice注解加@ExceptionHandler注解来指定不同的异常处理器。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MyException.class)
    public ModelAndView handleMyException(MyException ex, HttpServletRequest request, HttpServletResponse response) {
        // 处理自定义异常的逻辑
        return new ModelAndView("error");
    }
}

这样, 当SpringMVC的DispatcherServlet检测到有MyException异常抛出的时候, 就会调用handleMyException()方法来处理该异常。

掌控SpringMVC全局异常处理机制,优化项目性能

  • 降低开发成本

通过使用SpringMVC的全局异常处理机制, 开发者可以方便地实现不同的异常处理逻辑, 降低开发成本。

  • 提高代码的可维护性

通过使用SpringMVC的全局异常处理机制, 可以将异常处理的代码集中在一个地方, 提高代码的可维护性。

  • 提升系统性能

通过使用SpringMVC的全局异常处理机制, 可以避免异常在系统中传播, 提高系统性能。