从本质出发,让异常处理机制可控且自如!
2023-12-25 14:52:25
剖析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的全局异常处理机制, 可以避免异常在系统中传播, 提高系统性能。