SpirngMVC提供了对异常的捕获,常用的有三种方式:
1、自带的异常解析类
2、自定义异常解析类
3、使用注解实现异常解析捕获
SpringMVC在运行中的异常都是从下往上抛出的最后到达ExceptionResolver进行异常的处理,但是前端控制器没有给出该异常解析器的默认对象,想要使用那么就需要进行实现。
控制器:
//异常处理控制器
@Controller
public class ExceptionController {
// 主动出现异常,演示异常处理
@RequestMapping("/err1")
public String test1() {
Random random = new Random();
if (random.nextInt(2) == 0) {
throw new ArrayIndexOutOfBoundsException("亲,崩了");
} else {
throw new NullPointerException("亲,我出去旅个游");
}
}
}
错误页面:
error
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>出错啦,绩效又没了</title>
<style type="text/css">
.dv{
color:red;
}
</style>
</head>
<body>
<h1>错误信息</h1>
<div class="dv">${ex.getMessage() }</div>
</body>
</html>
nullError页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>空指针搞不到就回家</title>
<style type="text/css">
.dv{
color:red;
}
</style>
</head>
<body>
<h1>错误信息</h1>
<div class="dv">${ex.getMessage() }</div>
</body>
</html>
第一种:使用SimpleMappingExceptionResolver
配置文件:
<!-- 第一种方式 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--配置显示异常的错误页面 -->
<property name="defaultErrorView" value="error"></property>
<!--配置异常对象名称,可以不配置,默认exception -->
<property name="exceptionAttribute" value="ex"></property>
<!--如果想根据不同的异常,设置对应要显示错误的页面 -->
<property name="exceptionMappings">
<props>
<!--key为异常类 值为错误页面 -->
<prop key="java.lang.NullPointerException">nullError</prop>
</props>
</property>
</bean>
这样就可以了直接访问我们的控制器err1
第二种:使用HandlerExceptionResolver接口
自定义全局异常解析器:
//全局异常处理的第二种方式
public class SecondException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception exception) {
// TODO Auto-generated method stub
System.out.println("第二种异常捕获:");
ModelAndView mv=new ModelAndView();
mv.addObject("ex", exception);//将产生的异常对象添加到Model
mv.setViewName("error");
return mv;
}
}
在配置中进行配置:
<!-- 异常处理的第二种方式 -->
<bean class="org.qf.web.exception.SecondException"></bean>
第三种:使用注解 @ExceptionHandler
需要写在控制器中
控制器:
//异常处理控制器
@Controller
public class ExceptionController {
// 第一种异常处理和第二种异常处理
@RequestMapping("/err1")
public String test1() {
Random random = new Random();
if (random.nextInt(2) == 0) {
throw new ArrayIndexOutOfBoundsException("亲,崩了");
} else {
throw new NullPointerException("亲,我出去旅个游");
}
}
//异常处理方法,只能处理当前控制器类内部产生的异常,而且异常的类型必须为指定类
@ExceptionHandler(value = { Exception.class })
public ModelAndView test3(Exception ex) {
System.out.println("注解实现异常的捕获");
ModelAndView mv=new ModelAndView();
mv.addObject("ex", ex);
mv.setViewName("error");
return mv;
}
}
这个就不需要配置了。