SSM 统一异常处理

SSM 统一异常处理

spring创建中, 处理异常可以使用try-cache处理, 也可以使用spring提供的统一异常处理

在spring中, 统一处理异常有2中方式

  1. 注解方式

    @ExceptionHandler 作用于方法上

    @controlleradvice 作用于类上

  2. 接口方式

    HandlerExceptionResolver 接口

注解方式

注解方式用起来也是比较方便的, 注解方式有两种

  1. @ExceptionHandler单独使用, 前提是抛出异常的方法和处理异常的方法在同一个controller下
  2. @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;
    }
}
posted @ 2020-07-13 13:57  zpk-aaron  阅读(1330)  评论(0编辑  收藏  举报