SpringMVC处理异常

情景实例:

index.jsp页面内容

<a href="./computer/div.do?id=1">touch</a>

目标页to.jsp页面内容

target

处理请求方法controller类ComputerController代码

package com.jd.computer;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ComputerController {

	@RequestMapping("/computer/div.do")
	public String div(int id) {
		System.out.println(1/id);
		return "to";
	}
}

如果将传递的值id改为0,那么controller类中div方法将返回运行时异常,如下:

可见,如果我们不主动处理异常,那么当controller的方法出现异常时,就不会正确的显示我们预期的页面,因此可使用SpringMVC的两种方法来捕获并处理异常。

一、java代码处理

在Spring配置文件添加<mvc:annotation-driven>注解

<mvc:annotation-driven></mvc:annotation-driven>

在Controller类内添加异常处理方法,并用@ExceptionHandler注解修饰

package com.jd.computer;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ComputerController {

	@ExceptionHandler({ArithmeticException.class})//括号中可设置需要拦截异常的类型(可用{}数组拦截多个类型),此处拦截数学计算异常类型的异常
	public ModelAndView exception(ArithmeticException e) {
		e.getStackTrace();
		ModelAndView mv = new ModelAndView("error");//跳转到异常页面error
		mv.addObject("exception", e);
		return mv;
	}
	
	@RequestMapping("/computer/div.do")
	public String div(int id) {
		System.out.println(1/id);
		return "to";
	}
}

设置异常页面

error.jsp页面内容

${exception }

注意:

Controller类中可设置多个异常处理方法,当handler方法出现异常时,会优先选择与@ExceptionHandler()注解指定异常类型相同的异常处理办法,如:

package com.jd.computer;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ComputerController {

	@ExceptionHandler({ArithmeticException.class})
	public ModelAndView exception(ArithmeticException e) {
		System.out.println("ArithmeticException");
		e.getStackTrace();
		ModelAndView mv = new ModelAndView("error");
		mv.addObject("exception", e);
		return mv;
	}
	
	@ExceptionHandler({Exception.class})
	public ModelAndView exception(Exception e) {
		System.out.println("Exception");
		e.getStackTrace();
		ModelAndView mv = new ModelAndView("error");
		mv.addObject("exception", e);
		return mv;
	}
	
	@RequestMapping("/computer/div.do")
	public String div(int id) {
		System.out.println(1/id);
		return "to";
	}
}

结果:

另外:

上面的异常处理方法只能处理本Controller类内部方法产生的异常,若想避免代码重复,使用一个异常处理办法处理多个handler类内部方法的异常则可如下定义:

定义一个异常提示类ExceptionAdvice并用@ControllerAdvice注解修饰,在其内部定义异常处理方法即可处理所有handler的异常

package com.jd.advice;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class ExceptionAdvice {

	@ExceptionHandler({ArithmeticException.class})
	public ModelAndView exception(ArithmeticException e) {
		System.out.println("ArithmeticException");
		e.getStackTrace();
		ModelAndView mv = new ModelAndView("error");
		mv.addObject("exception", e);
		return mv;
	}
}

二、使用Spring配置处理异常

<?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:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<context:component-scan base-package="com.jd"></context:component-scan>
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp"></bean>
	
	<mvc:annotation-driven></mvc:annotation-driven>
	
        <!-- 配置SimpleMappingExceptionResolver视图解析器 -->
	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
                <!-- 配置异常属性名:exceptionAttribute默认值为exception,此时jsp页面通过${exception}显示异常信息;添加<property name="exceptionAttribute" value="ex"></property>配置后,则通过${ex}显示异常信息 -->
		<property name="exceptionAttribute" value="e"></property>
		<property name="exceptionMappings">
			<props>
                                <!-- 服务器端异常均指向error.jsp页面 -->
				<prop key="java.lang.Throwable">error</prop>
			</props>
		</property>
	</bean>
</beans>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值