异常处理是 SpringMVC 中非常重要的一个功能,它可以有效地捕获并处理系统中出现的异常情况,提高系统的稳定性和容错性。SpringMVC 提供了多种方式来实现异常处理,包括使用 @ControllerAdvice 注解、自定义异常类、使用 @ExceptionHandler 注解等。下面将结合代码示例,详细介绍 SpringMVC 中异常处理的实现方式。

使用 @ControllerAdvice 注解实现全局异常处理

在 SpringMVC 中,可以通过 @ControllerAdvice 注解来定义全局异常处理类,该类可以对所有的 Controller 层抛出的异常进行捕获和处理。具体实现步骤如下:

  1. 创建一个全局异常处理类,使用 @ControllerAdvice 注解进行标记。
  2. 在该类中通过 @ExceptionHandler 注解定义具体的异常处理方法。
  3. 在异常处理方法中可以进行一些自定义逻辑,比如记录日志、返回错误信息等。
@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理自定义异常
     */
    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(HttpServletRequest request, CustomException ex) {
        // 记录日志
        logger.error("发生自定义异常:", ex);
        
        // 返回错误信息页面
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", ex.getMessage());
        modelAndView.setViewName("error");
        
        return modelAndView;
    }
    
    /**
     * 处理其他异常
     */
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(HttpServletRequest request, Exception ex) {
        // 记录日志
        logger.error("发生未知异常:", ex);
        
        // 返回错误信息页面
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", "发生未知异常,请联系管理员");
        modelAndView.setViewName("error");
        
        return modelAndView;
    }
}
Java

自定义异常类

除了使用 @ControllerAdvice 注解全局捕获异常外,还可以自定义异常类来处理特定的异常情况。自定义异常类需要继承自 Exception 或 RuntimeException,通过在异常类上添加 @ResponseStatus注解指定HTTP 响应状态码,可以在抛出异常时返回指定的错误状态码。具体实现步骤如下:

  1. 创建一个自定义异常类,继承自 Exception 或 RuntimeException。
  2. 在自定义异常类上添加 @ResponseStatus 注解,指定 HTTP 错误状态码。
  3. 在 Controller 层抛出自定义异常。
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public class CustomException extends RuntimeException {

    public CustomException(String message) {
        super(message);
    }
}
Java

使用 @ExceptionHandler 注解实现异常处理

除了全局异常处理和自定义异常类,还可以使用 @ExceptionHandler 注解来实现对特定异常的捕获和处理。通过在 Controller 层的方法上添加 @ExceptionHandler 注解,并指定要处理的异常类型,可以对该方法中抛出的指定异常进行捕获和处理。具体实现步骤如下:

  1. 在 Controller 层的方法上添加 @ExceptionHandler 注解,并指定要处理的异常类型。
  2. 在异常处理方法中进行一些自定义逻辑,比如记录日志、返回错误信息等。
@Controller
public class UserController {

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(HttpServletRequest request, CustomException ex) {
        // 记录日志
        logger.error("发生自定义异常:", ex);
        
        // 返回错误信息页面
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", ex.getMessage());
        modelAndView.setViewName("error");
        
        return modelAndView;
    }

    @RequestMapping("/user/{id}")
    public String getUser(@PathVariable("id") Integer id) {
        if (id == null) {
            throw new CustomException("用户ID不能为空");
        }
        // 其他业务逻辑...
        return "success";
    }
}
Java

通过以上三种方式,我们可以在 SpringMVC 中实现异常的捕获和处理。全局异常处理能够对所有 Controller 层抛出的异常进行统一处理;自定义异常类能够根据业务需求自定义异常的响应;@ExceptionHandler 注解能够对特定的异常进行捕获和处理。根据实际情况选择合适的方式来实现异常处理能够有效地提高系统的容错性和稳定性。