SSM 统一异常处理
目录
SSM 统一异常处理
spring创建中, 处理异常可以使用try-cache处理, 也可以使用spring提供的统一异常处理
在spring中, 统一处理异常有2中方式
-
注解方式
@ExceptionHandler
作用于方法上@controlleradvice
作用于类上 -
接口方式
HandlerExceptionResolver
接口
注解方式
注解方式用起来也是比较方便的, 注解方式有两种
@ExceptionHandler
单独使用, 前提是抛出异常的方法和处理异常的方法在同一个controller下@controlleradvice
和@ExceptionHandler
配合使用, 如果当前controller下没有处理异常的方法, 则去找@controlleradvice描述的类下面处理异常的方法
单独使用@ExceptionHandler
此方式仅限于处理异常的方法和抛出异常的方法在同一个controller里
次注解的参数是可以处理异常的类型字节码对象, 例如写RuntimeException.class
则处理此异常以及其子类的异常, 处理异常的方法参数和注解的参数类型一般来说是一致的.
@Controller
public class GlobalController {
/**
* 用于处理异常的
*/
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.println(e.getMessage());
e.printStackTrace(); // 控制台打印报错信息
return "exception";
}
// 此请求会抛出异常
@RequestMapping("/index")
public String test() {
throw new MyException("出错了!");
return "index";
}
}
使用 @ControllerAdvice+ @ ExceptionHandler 注解
@ ExceptionHandler 需要进行异常处理的方法必须与出错的方法在同一个Controller里面。那么当代码加入了 @ControllerAdvice,则不需要必须在同一个 controller 中了。这也是 Spring 3.2 带来的新特性。从名字上可以看出大体意思是控制器增强。 也就是说,@controlleradvice + @ ExceptionHandler 也可以实现全局的异常捕捉。
/**
* @ControllerAdvice 注解描述的类, spring mvc会分为他是
* 一个控制层全局异常的处理
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* @ExceptionHandler 注解描述的方法为异常处理方法,
* 次注解中定义的异常类型, 为这个方法可以处理的异常类型, 它可以处理
* 此异常以及这个异常类型的子类类型的异常
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
@ResponseBody // 告诉spring mvc最终相应结果转换为json格式返回, 如果返回的是页面可不写次注解
public JsonResult doHandleRuntimeException(RuntimeException e) {
e.printStackTrace();
return new JsonResult(e);
}
// .....等多个处理异常的方法
}
实现 HandlerExceptionResolver 接口
即mvc中所有的异常都可以在这里进行处理
@Component
public class ExceptionTest implements HandlerExceptionResolver{
/**
* TODO 简单描述该方法的实现功能(可选).
* @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
*/
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
System.out.println("This is exception handler method!");
return null;
}
}