异常处理
@ExceptionHandler和@ResponseStatus
@ExceptionHandler
@ExceptionHandler标识的方法的参数 必须在异常类型(Throwable或其子类) 中,不能包含其他类型的参数。
例如:
有一个异常
@RequestMapping("testExceptionHandler")
public String testExceptionHandler() {
System.out.println(1/0);//触发异常
return "successe";
}
在同一个类中编写如下方法:
//该方法可以捕获本类中抛出的ArithmeticException异常
@ExceptionHandler({ArithmeticException.class})
public ModelAndView handlerArithmeticException(ArithmeticException e) {
ModelAndView mv=new ModelAndView("error");
System.out.println(e);
mv.addObject("e",e);
return mv;
}
使用ModelAndView是为了跳转到错误页面。
error.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${requestScope.e}
</body>
</html>
@ExceptionHandler默认只能捕获 当前类中的异常方法。
如果发生异常的方法 和处理异常的方法 不在同一个类中:则使用@ControllerAdvice
package org.cduck.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice//加了该注解可以捕获其它类中的异常
public class MyExceptionController {//不是控制器,仅仅是专门用来处理异常的类
@ExceptionHandler({Exception.class})
public ModelAndView handlerArithmeticException2(Exception e) {
ModelAndView mv=new ModelAndView("error");
System.out.println(e+"22222222222");
mv.addObject("e",e);
return mv;
}
}
总结:如果一个方法用于处理异常,并且只处理当前类中的异常:@ExceptionHandler
如果一个方法用于处理异常,并且处理所有类中的异常: 类前加@ControllerAdvice、 处理异常的方法前加@ExceptionHandler
@ResponseStatus(自定义异常显示页面)
有一数组越界异常可用以下方法定制异常显示页面
@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="数组越界222!!!")
public class MyArrayIndexOutofBoundsException extends Exception {//自定义异常
}