SpringMVC处理异常

情景实例:

index.jsp页面内容

touch

目标页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方法将返回运行时异常,如下:

SpringMVC处理异常_第1张图片

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

一、java代码处理

在Spring配置文件添加注解

在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配置处理异常




	
	
	
	
	
	
        
	
                
		
		
			
                                
				error
			
		
	

 

你可能感兴趣的:(SpringMVC)