推荐答案
在Spring MVC中,可以通过以下几种方式进行异常处理:
使用
@ExceptionHandler注解:在控制器中定义一个方法,并使用@ExceptionHandler注解来捕获特定类型的异常。该方法可以返回一个视图名称或一个ResponseEntity对象。使用
@ControllerAdvice注解:创建一个全局异常处理类,并使用@ControllerAdvice注解。在该类中定义多个@ExceptionHandler方法来处理不同控制器中抛出的异常。实现
HandlerExceptionResolver接口:自定义一个异常解析器,实现HandlerExceptionResolver接口,并在Spring配置中注册该解析器。使用
@ResponseStatus注解:在自定义异常类上使用@ResponseStatus注解,指定HTTP状态码和错误信息。
本题详细解读
1. 使用@ExceptionHandler注解
@ExceptionHandler注解允许你在控制器中定义一个方法来处理特定类型的异常。例如:
// www.javascriptcn.com code example
@Controller
public class MyController {
@ExceptionHandler(MyCustomException.class)
public ResponseEntity<String> handleMyCustomException(MyCustomException ex) {
return new ResponseEntity<>("Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@GetMapping("/example")
public String example() throws MyCustomException {
throw new MyCustomException("Something went wrong");
}
}在这个例子中,handleMyCustomException方法会捕获MyCustomException异常,并返回一个包含错误信息的ResponseEntity。
2. 使用@ControllerAdvice注解
@ControllerAdvice注解允许你定义一个全局异常处理类,处理多个控制器中抛出的异常。例如:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MyCustomException.class)
public ResponseEntity<String> handleMyCustomException(MyCustomException ex) {
return new ResponseEntity<>("Global Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}在这个例子中,GlobalExceptionHandler类会捕获所有控制器中抛出的MyCustomException异常,并返回一个全局错误响应。
3. 实现HandlerExceptionResolver接口
通过实现HandlerExceptionResolver接口,你可以自定义一个异常解析器来处理异常。例如:
// www.javascriptcn.com code example
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error");
modelAndView.addObject("errorMessage", ex.getMessage());
return modelAndView;
}
}然后,在Spring配置中注册该解析器:
<bean class="com.example.CustomExceptionResolver"/>
4. 使用@ResponseStatus注解
@ResponseStatus注解可以用于自定义异常类,指定HTTP状态码和错误信息。例如:
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource not found")
public class ResourceNotFoundException extends RuntimeException {
// 异常类实现
}当抛出ResourceNotFoundException时,Spring会自动返回HTTP 404状态码和指定的错误信息。