当系统中出现异常时,有些异常可以主动用try catch 捕获处理,有些异常希望全局统一处理,而不是单独处理,如希望遇到运行时异常时跳到一个出错页面,而不是在当前页面输出一些错误信息。
在WEB-INFO同级目录添加一个error.jsp。如下:
统一异常有两种处理方式,在类中使用注解,或在配置文件中配置。
1. 方式一:配置文件
在springMVC-servlet.xml中添加配置:
<!-- 统一异常 -->
<bean id="handlerExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">redirect:/error.jsp</prop>
</props>
</property>
</bean>
添加一个controller内容如下:
@Controller
@RequestMapping("/exception")
public class ExceptionController {
@RequestMapping("handler")
public String handler(){
System.out.println(1/0);
return "redirect:/home.jsp";
}
}
访问localhost:8080/firstSpringMVC/exception/handler结果如下:
如果没有此配置,访问页面结果如下:
2. 方式二:类中加注解
去掉上面的配置,在controller类中添加统一异常处理代码。
@Controller
@RequestMapping("/exception")
public class ExceptionController {
@RequestMapping("handler")
public String handler(){
System.out.println(1/0);
return "redirect:/home.jsp";
}
// 统一异常处理
@ExceptionHandler(RuntimeException.class)
public String handlerException(RuntimeException runtimeException){
return "redirect:/error.jsp";
}
}
增加一个ExceptionHandler注解,返回一个错误页面。
访问localhost:8080/firstSpringMVC/exception/handler结果如下:
注:此注解必须放到当前类,或者放到父类中。
如果将ExceptionHandler放到另一个controller类中,访问exception/handler将不会被跳转到error.jsp
3. 方式三:配置加自定义类
定义统一的异常处理类:
public class GaryExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
System.out.println("-------error---------" + ex.getMessage());
ModelAndView modelView = new ModelAndView();
modelView.setViewName("error");
return modelView;
}
}
在spring的配置文件applicationContext.xml中增加配置:
<bean id="exceptionHandler" class="com.gary.exceptionresolver.GaryExceptionResolver"/>
在jsp目录中创建error.jsp文件:
测试成功。在这里可以根据不同的异常类别,选择返回不同的错误页。
if (ex instanceof GBQException) {
// XXX
}
注:如果前面没有添加spring的配置文件applicationContext.xml,操作如下:
在src目录下创建applicationContext.xml:
在web.xml中增加如下配置:
<!-- 加载spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 监听application的上下文,放入application对象中 -->
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
applicationContext.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd"
>
<bean id="exceptionHandler" class="com.gary.exceptionResolver.GaryExceptionResolver"/>
</beans>
4. 自定义异常
常见的异常类有:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常
这些类都是派生自Exception
自定义异常类也可以派生自Exception,建议重载一个带参数的构造函数。以方便new时可直接将错误描述带上。
为了在统一处理异常中使用自定义异常,这里我们需要将异常派生自RuntimeException。
public class GaryException extends RuntimeException{
public GaryException(String msg){
super(msg);
}
}
统一异常的代码修改如下:
public class GaryExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
System.out.println("-------error---------" + ex.getMessage());
ModelAndView modelView = new ModelAndView();
// 根据不同错误转向不同页面
if (ex instanceof GaryException) {
modelView.setViewName("garyError");
} else {
modelView.setViewName("error");
}
return modelView;
}
}
测试代码:
@RequestMapping("handler")
public String handler(){
System.out.println(1/0);
return "redirect:/home.jsp";
}
@RequestMapping("handler2")
public String handler2(){
throw new GaryException("garyError");
}
http://localhost:8080/firstSpringMVC/exception/handler
http://localhost:8080/firstSpringMVC/exception/handler2
会调到不同错误页面。