java_springMVC_统一异常

当系统中出现异常时,有些异常可以主动用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

会调到不同错误页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值