springMVC异常处理的知识点+异常处理案例
异常介绍:
我们知道系统中的异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生
在SpringMVC处理异常的方式为:将系统的Dao、Service、Controller出现的异常都通过throws Excepton 向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理
如下图所示:
异常处理:
在SpringMVC中异常处理有三种方法:
**第一种:**Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
<!--配置mvc提供的默认异常处理器:simpleMapperExceptionResolver--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView" value="error"></property><!--表示所有没有指定的异常,都跳转到异常处理页面error--> <property name="exceptionAttribute" value="ex"></property> <!--表示异常处理页面中访问的异常对象变量名是ex--> <!-- 异常映射exceptionMappings表示映射的异常,接受参数是一个Properties,key是异常类名,value是处理异常的页面--> <property name="exceptionMappings"> <map> <entry key="NullPointerException" value="error"></entry> <entry key="ClassCastException" value="error"></entry> </map> </property> </bean>
**第二种:**实现Spring的异常处理接口HandlerExceptionResolver 自定义的异常处理器
①创建异常处理器类实现HandlerExceptionResolver
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//处理异常的代码实现
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("exceptionPage");
return modelAndView;
}
}
②配置异常处理器
<bean id="exceptionResolver" class="com.exception.MyExceptionResolver"/>
③编写异常页面:exceptionPage
**第三种方法:**使用@ExceptionHandler注解实现异常处理;
使用方法有两种:
1.在可能出现异常的Controller层进行异常处理,也就是在同一个类中进行异常处理:@Controller+@ExceptionHandler
@Controller
@RequestMapping("/testController")
public class TestController {
@RequestMapping("/demo1")
@ResponseBody
public Object demo1(){
int i = 1 / 0;
return new Date();
}
@ExceptionHandler({RuntimeException.class})
public ModelAndView fix(Exception ex){
System.out.println("do This");
return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));
}
}
注意事项:
1.一个Controller下多个@ExceptionHandler上的异常类型不能出现一样的,否则运行时抛异常.
Ambiguous @ExceptionHandler method mapped for;
2.@ExceptionHandler下方法返回值类型支持多种,常见的ModelAndView,@ResponseBody注解标注, ResponseEntity等类型都OK.
2.全局级别处理:@ControllerAdvice+@ExceptionHandler
@ControllerAdvice
public class GlobalController {
@ExceptionHandler(RuntimeException.class)
public ModelAndView fix1(Exception e){
System.out.println("全局的异常处理器");
ModelMap mmp=new ModelMap();
mmp.addAttribute("ex",e);
return new ModelAndView("error",mmp);
}
}
用法说明: 与第一种方式用法相同,返回值支持ModelAndView,@ResponseBody等多种形式.
异常处理案例
上面我们已经了解了SpringMVC的三种方法,下面我们分别用上面的方法来做几个案例吧!
第一个案例:使用SpringMVC提供的方法
第一步:创建一个maven项目:略
第二步:在pom.xml中添加以下的依赖或插件坐标:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18