SpringMVC-6

SpringMVC异常处理

SpringMVC通过HandlerExceptionResolver处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常。
SpringMVC提供的HandlerException是一个接口,它的实现类:
1.AbstractHandlerExceptionResolver它还有自己的子类
1.AnnotationMethodExceptionResolver
2.DefaultHandlerExceptionResolver
3.ResponseStatusExceptionResolver
4.SimpleMappingExceptionResolver
2.HandlerExceptionResolverComposite

DispatcherServlet默认装配的HandlerResolvedr:
1.AnnotationMethodExceptionResolver
2.DefaultHandlerExceptionResolver
3.ResponseStatusExceptionResolver

如果我们使用了mvc:annotation-driven/
AnnotationMethodExceptionResolver
ExceptionHanlderExceptionResolver
DefaultHandlerExceptionResolver
ResponseStatusExceptionResolver

ExceptionHandlerExceptionResolver:

主要处理Handler中使用@ExceptionHandler注解定义的方法
@ExceptionHandler注解定义的方法优先级的问题:例如发生的是NullPointException,但是声明的异常有RuntimeException和Exception,此时会根据异常的就近继承关系找到深度最浅的那个@ExceptionHandler注解方法,也就是标记RuntimeException的方法。

ExceptionHandlerMethodResolver内部如果找不到@ExceptionHandler注解的话,会找@ControllerAdvice中的@ExceptionHandler注解的方法
注意:我们在使用@ExceptionHandler的时候,用此注解修饰的方法中可以写入Exception类型得对象,此对象对应出现的异常,如果此时我们需要将异常对象保存在属性范围中时,不能使用map对象保存,而是使用ModelAndView保存。

注意:我们现在编写的处理异常的方式,只能处理Handler方法中出现的异常。那么如果在Handler方法中没有找到匹配的异常,SpringMVC会去使用@ControllerAdvice修饰的类中查找异常。
例子:
(1)书写一个简单的数字计算的超链接

   <a href = "mathtest?mun=0">mathtest</a>

(2)在handler里面写入计算的处理方法

@RequestMapping("mathtest")
	public String mathtest(@RequestParam("mun") Integer mun){
		System.out.println("result"+(10/mun));
		return "success";
	}
	

(3)异常处理的代码:

@ExceptionHandler(value=ArithmeticException.class)
	public String handlerExceptiontest(){
		return "error";
	}

(4)我们可以通过ModelAndView对象将异常传递给跳转页面,代码如下:

@ExceptionHandler(value=ArithmeticException.class)
	public ModelAndView handlerExceptiontest(Exception ex){
		ModelAndView mv = new ModelAndView("error");
		mv.addObject("ex", ex);
		return mv;
	}

(5)如果在handler类里面找不到异常处理MVC回去有@ControllerAdvice注解的类去寻找处理方法,代码如下:

package com.oracle.handler;

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

@ControllerAdvice
public class exceptiontest {
	@ExceptionHandler(value=ArithmeticException.class)
	public ModelAndView handlerExceptiontest(Exception ex){
		ModelAndView mv = new ModelAndView("error");
		mv.addObject("ex", ex);
		return mv;
	}
}

ResponseStatusExceptionResolver:

在异常以及异常父类中找到@ResponseStatus注解,然后使用这个注解的属性进行处理。

我们可以用注解来进行修饰产生的异常:
1.修饰异常类例子:
(1)自定义异常代码

package com.oracle.po;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value=HttpStatus.NOT_EXTENDED,reason= "用户名不正确")
public class MyException extends RuntimeException{
	public MyException(String name ){
		super(name);
	}
}

(2)跳转的超链接

    <a href = "extest?mun=10">extest</a>

(3)处理的方法

@RequestMapping(value = "/extest")
	public String extest(@RequestParam("mun") Integer num){
		if(num==10){
			throw new MyException("自定义异常");
		}
		return "success";
	}

注:当用@ResponseStatus注释修饰后,当产生异常的时候,就会抛出与注释相关的异常,value属性设置异常的状态码,reason是产生异常的原因。
2.当修饰类中的方法的
当修饰方法时,方法正常运行之后也会抛出异常:

	@RequestMapping(value = "/extest")
	@ResponseStatus(value=HttpStatus.NOT_EXTENDED,reason= "用户名不正确")
	public String extest(@RequestParam("mun") Integer num){
		if(num==10){
			throw new MyException("自定义异常");
		}
		return "test";
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值