SpingMVC-异常处理

SpingMVC

异常处理_ExceptionHandler注解

  • SpingMVC-异常处理

  • SpingMVC-异常处理

  • 测试

    • 先在SpringMVCTest.java中新建一个测试方法

      @RequestMapping("/testExceptionHandlerExceptionResolver")
      	public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i){
      		System.out.println("result: " + (10 / i));
      		return "success";
      	}
      
    • 再在index.jsp中新建一个超链接

      <a href="testExceptionHandlerExceptionResolver?i=10">Test ExceptionHandlerExceptionResolver</a>

    • 在SpringMVCTest.java中写两个出异常的方法

      	@ExceptionHandler({RuntimeException.class})
      	public ModelAndView handleArithmeticException2(Exception ex){
      	System.out.println("[出异常了]: " + ex);
      		ModelAndView mv = new ModelAndView("error");
      		mv.addObject("exception", ex);
      		return mv;
      	}
      	
      	/**
      	 * 1. 在 @ExceptionHandler 方法的入参中可以加入 Exception 类型的参数, 该参数即对应发生的异常对象
      	 * 2. @ExceptionHandler 方法的入参中不能传入 Map. 若希望把异常信息传导页面上, 需要使用 ModelAndView 作为返回值
      	 * 3. @ExceptionHandler 方法标记的异常有优先级的问题.  会查找最接近这个异常的方法
      	 * 4. @ControllerAdvice: 如果在当前 Handler 中找不到 @ExceptionHandler 方法来出来当前方法出现的异常, 
      	 * 则将去 @ControllerAdvice 标记的类中查找 @ExceptionHandler 标记的方法来处理异常. 
      	 */
      	@ExceptionHandler({ArithmeticException.class})
      	public ModelAndView handleArithmeticException(Exception ex){
      		System.out.println("出异常了: " + ex);
      		ModelAndView mv = new ModelAndView("error");
      		mv.addObject("exception", ex);
      		return mv;
      	}
      
    • 当修改testExceptionHandlerExceptionResolver超链接的i为0时,触发数学异常会执行精确度最高的@ExceptionHandler({ArithmeticException.class})这个异常

      页面效果

      SpingMVC-异常处理

  • @ControllerAdvice: 如果在当前 Handler 中找不到 @ExceptionHandler 方法来出来当前方法出现的异常,
    则将去 @ControllerAdvice 标记的类中查找 @ExceptionHandler 标记的方法来处理异常.

    • 测试时 要先把SpringMVCTest.java的那两个异常方法注掉

      • 在com.atguigu.springmvc.test包下新建一个SpringMVCTestExceptionHandler.java类

        import org.springframework.web.bind.annotation.ControllerAdvice;
        import org.springframework.web.bind.annotation.ExceptionHandler;
        import org.springframework.web.servlet.ModelAndView;
        
        @ControllerAdvice
        public class SpringMVCTestExceptionHandler {
        
        	@ExceptionHandler({ArithmeticException.class})
        	public ModelAndView handleArithmeticException(Exception ex){
        		System.out.println("----> 出异常了: " + ex);
        		ModelAndView mv = new ModelAndView("error");
        		mv.addObject("exception", ex);
        		return mv;
        	}
        	
        }
        

异常处理_ResponseStatusExceptionResolver

  • 测试

    • @ResponseStatus加到类上

      • 在com.atguigu.springmvc.test包下新建一个UserNameNotMatchPasswordException.java类(自定义一个异常)

        package com.atguigu.springmvc.test;
        
        import org.springframework.http.HttpStatus;
        import org.springframework.web.bind.annotation.ResponseStatus;
        /*
         * value=HttpStatus.FORBIDDEN这个是状态码403 reason="用户名和密码不匹配!":原因
         */
        @ResponseStatus(value=HttpStatus.FORBIDDEN, reason="用户名和密码不匹配!")
        public class UserNameNotMatchPasswordException extends RuntimeException{
        
        	/**
        	 * 
        	 */
        	private static final long serialVersionUID = 1L;
        
        	
        }
        
      • 在SpringMVCTest.java下新建一个测试方法

        @RequestMapping("/testResponseStatusExceptionResolver")
        	public String testResponseStatusExceptionResolver(@RequestParam("i") int i){
        		if(i == 13){
        			throw new UserNameNotMatchPasswordException();
        		}
        		System.out.println("testResponseStatusExceptionResolver...");
        		
        		return "success";
        	}
        
      • 在index.jsp中建立一个对应的超链接

        <a href="testResponseStatusExceptionResolver?i=10">Test ResponseStatusExceptionResolver</a>

        点击超链接并把i改为13,则触发我们自定义的异常

        SpingMVC-异常处理

    • @ResponseStatus加到方法上

      	@ResponseStatus(reason="测试",value=HttpStatus.NOT_FOUND)
      	@RequestMapping("/testResponseStatusExceptionResolver")
      	public String testResponseStatusExceptionResolver(@RequestParam("i") int i){
      		if(i == 13){
      			throw new UserNameNotMatchPasswordException();
      		}
      		System.out.println("testResponseStatusExceptionResolver...");
      		
      		return "success";
      	}
      

      这时无论超链接上的i改为多少 都会弹出异常页面,但是打印是正常的

      SpingMVC-异常处理

异常处理_DefaultHandlerExceptionResolver

  • SpingMVC-异常处理

  • 测试

    • 在SpringMVCTest.java下新建一个方法

      @RequestMapping(value="/testDefaultHandlerExceptionResolver",method=RequestMethod.POST)
      	public String testDefaultHandlerExceptionResolver(){
      		System.out.println("testDefaultHandlerExceptionResolver...");
      		return "success";
      	}
      
    • 在index.jsp中加入一个超链接

      <a href="testDefaultHandlerExceptionResolver">Test DefaultHandlerExceptionResolver</a>

    • 这时点击此超链接就会触发异常,因为点击超链接是get请求,但是@RequestMapping注解里只让post请求访问

      SpingMVC-异常处理

异常处理_SimpleMappingExceptionResolver

  • SpingMVC-异常处理

  • 在SpringMVCTest.java里建一个目标方法

    • @RequestMapping("/testSimpleMappingExceptionResolver")
      	public String testSimpleMappingExceptionResolver(@RequestParam("i") int i){
      		String [] vals = new String[10];
      		System.out.println(vals[i]);
      		return "success";
      	}
      
  • 在springmvc.xml中配置出异常时转向哪个页面

    • <!-- 配置使用 SimpleMappingExceptionResolver 来映射异常 -->
      	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
      		<property name="exceptionAttribute" value="ex"></property>
      		<!-- exceptionAttribute是异常的属性名 value="ex"也就是把我们用的exception改为ex 比如${requestScope.exception }就可以改为${requestScope.ex }   -->
              <property name="exceptionMappings">
      			<props>
                      <!--配置出现数组越界异常转向的页面-->
      				<prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop>
      			</props>
      		</property>
      	</bean>	
      
  • 在index.jsp中加入对应的超链接

    <a href="testSimpleMappingExceptionResolver?i=2">Test SimpleMappingExceptionResolver</a>

    点击超链接后,把超链接上的i改为20(方法中数组范围是10)所以越界了出现异常

    因为xml文件中配置了出现数组越界异常转向的error页面,所以页面转向error页面

上一篇:第8章.商品详情页面之thymeleaf


下一篇:@ControllerAdvice与@ControllerAdvice统一处理异常