在spring中处理异常时,通常会在Controller中定义具体的异常处理的方法,这个方法上使用@HandlerException注解进行描述
.例如,在指定Controller中定义异常处理方法:
@ExceptionHandler(value=Exception.class)
@ResponseBody
public String handleException(Exception e){
System.out.println("局部异常处理");
return e.getMessage();
}
当多个异常处理类中很多异常处理的方式相同时,还可以将这个异常处理的方法提取到父类,以实现方法的重用。假如不希望将共性的异常处理方法提取到父类,还可以在外部定义一个全局的异常处理类,这个类使用@ControllerAdvice注解进行修饰,然后在这类中定义具体的异常处理方法,这些方法再使用@HandlerException进行修饰
例如:
@ControllerAdvice
public class AdviceExceptionHandler {
@ExceptionHandler(Throwable.class)
@ResponseBody
public String handlerException(Throwable e){
System.out.println("全局的异常处理");
return e.getMessage();
}
}
Spring mvc中异常处理机制的总结:
- 为什么进行异常处理?
提高系统的容错能力,让系统表现的更友好
2.spring mvc中异常处理的方式?
局部的,全局的
3.局部方式异常处理如何实现?
Controller类中直接定义异常处理方法,使用@ExceptionHandler进行修饰
4.全局方式异常处理如何实现?
通过继承将共性提取到父类,通过@ControllerAdvice注解修饰类,然后在类中定义异常处理的方法
5.出现异常后,异常处理的具体机制是怎样的?
首先会在当前Controller(包含父类)中查找有没有定义异常处理的方法,假如有则查看注解中定义的异常类型是否与当前异常类型匹配,假如匹配则直接处理,假如不匹配则查看当前类中有没有父类类型的异常处理方法与当前异常匹配,假如有,则直接处理,没有,咋找全局异常处理。全局也没有则直接不友好的输出错误信息。
说明:实际项目中在controller的方法中除了要对正确的业务数据进行封装之外,还会对异常信息进行封装(例如封装到JsonResult),然后转换为json格式的字符串,输出到客户端。