0%

springmvc异常处理

springmvc异常处理

springmvc通过HandlerExceptionResolver来处理程序的异常

一般情况下使用@ExceptionHandler注解来进行标注异常处理

ExceptionHandlerExceptionResolver异常处理

  • 如果出现异常,先是查找该Controller中用@ExceptionHandler注解定义的方法
  • 如果没有找到@ExceptionHandler注解的话,就会寻找标记了@ControllerAdvice注解的类中的@ExceptionHandler注解方法

局部异常处理

在当前Controller中处理异常(当前Controller中使用@ExceptionHandler标注的方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Controller
@RequestMapping("/exception")
public class ExceptionController {

/**
* 在@Controller中所写的@ExceptionHandler方法只能处理该Controller类中出现的异常,不可以处理其他Controller中出现的异常,此为局部异常处理
*/
@ExceptionHandler
@ResponseBody
public String exception(Exception e){
return "出现异常"+e.getMessage();
}

@RequestMapping("/testException")
@ResponseBody
public String testException(){
User user = null;
System.out.println(user.getId());
return "success";
}
}

全局异常处理

如果当前Controller中没有异常处理,则会使用全局异常(使用@ControllerAdvice标注的类中的@ExceptionHandler方法)

1
2
3
4
5
6
7
8
9
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler
@ResponseBody
public String exception(Exception e){
return "全局捕获: 出现异常"+e.getMessage();
}
}

ResponseStatusExceptionResolver异常处理

该异常处理机制是来解析@ResponseStatus来标注的异常

自定义异常

1
2
3
4
5
// code指定的是状态码,reason指定的是错误信息
@ResponseStatus(code = HttpStatus.BAD_REQUEST,reason = "出现业务异常")
public class BusinessException extends RuntimeException{

}
1
2
3
4
5
@RequestMapping("/testBusinessException")
@ResponseBody
public String testBusinessException(){
throw new BusinessException();
}

调用该接口就会返回到状态码为400的错误页面