异常处理
- 局部的异常处理器,只针对某个控制器
// 专门定义一个处理异常的方法,如: ArrayIndexOutOfBoundsException 异常
@ExceptionHandler(Exception.class) // 异常处理器, 可以指定具体的异常类型
public String error(Exception e) {
System.out.println("进入了 ExceptionController error " + e.getMessage());
return "error";
}
- 全局的异常处理器,针对所有的控制器
@ControllerAdvice
class 全局异常处理器类 {@ExceptionHandler(异常类型)
public String error(异常对象) {
// 异常处理
return "视图名";
}
}注:局部的异常处理优先级高于全局的异常处理,因此两个都有的时候,会先执行局部,再到全局。
代码演示
1、局部异常处理器
局部异常处理类
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ExceptionController {
// 传统的方式, 处理控制器出现的异常,出现异常就跳到error.jsp页面
/*@RequestMapping("/e1")
public String e1() {
try {
System.out.println("进入了 ExceptionController e1");
int [] a = {};
System.out.println(a[0]);
return "hello";
} catch (Exception e) {
return "error";
}
}*/
// spring mvc 的方式, 处理异常
@RequestMapping("/e1")
public String e1() {
System.out.println("进入了 ExceptionController e1");
int [] a = {};
System.out.println(a[0]);
return "hello";
}
// 专门定义一个处理异常的方法
//异常处理器, 可以指定具体的异常类型 如: ArrayIndexOutOfBoundsException
@ExceptionHandler(Exception.class)
public String error(Exception e) {
//e.getMessage() 打印错误信息
System.out.println("进入了 ExceptionController error " + e.getMessage());
return "error";
}
}
error.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
美化的,显示错误的页面
</body>
</html>
结果
控制台(服务器)输出以下信息,表示数组下标越界异常,异常就跳转到error.jsp页面
进入了 ExceptionController e1
进入了 ExceptionController error 0
2、全局异常处理器
全局异常处理类
// 全局的异常处理器类
@ControllerAdvice
public class ExceptionAspect {
//定义异常类型
@ExceptionHandler(Exception.class)
public String exception(Exception e) {
System.out.println("全局异常处理方法..." + e.getMessage());
return "error";
}
}
如果代码出现异常,会由全局异常处理器,处理异常
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ExceptionController {
@RequestMapping("/e1")
public String e1() {
System.out.println("进入了 ExceptionController e1");
int [] a = {};
System.out.println(a[0]);
return "hello";
}
}
结果
跳到的还是上面那张图的页面,控制台上输出以下:
进入了 ExceptionController e1
全局异常处理方法...0
最重要的一点是,当全局和局部异常处理器都存在时,根据就近原则,局部异常处理器会优先于全局异常处理器执行。