SpringMVC异常处理
系统中异常主要包括两部分,[编译时异常与运行时异常] Spring,SpringMVC,前者可以通过捕获异常从而获取异常信息,后者主要通过规范代码格式,测试等手段减少异常出现
在开发过程中,系统的DAO层,SERVICE层和CONTROLLER层都有可能出现异常情况,这种情况下我们应该尽量将异常向上层抛出,最后将所有异常交由SpringMVC的前端控制器处理,其会利用异常处理器来进行异常处理
SpringMVC异常处理的两种方式
- 直接使用SpringMVC提供的简单异常处理器:SimpleMappingExceptionResolver
- 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
1. 使用SimpleMappingExceptionResolver
配置简单映射异常处理器
代码语言:javascript复制<!--配置简单映射异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--配置默认错误视图,指向error.jsp-->
<property name="defaultErrorView" value="error"/>
<!--异常映射,将指定报错映射到指定视图,一旦出现指定报错跳转到指定页面-->
<property name="exceptionMappings">
<map>
<!--键为错误类,值为跳转视图-->
<entry key="cn.ywrby.exception.MyException" value="error"/>
<entry key="java.lang.ClassCastException" value="error"/>
</map>
</property>
</bean>
测试异常
产生异常的方法
代码语言:javascript复制@Service("exceptionService")
public class ExceptionServiceImpl implements ExceptionService {
public void showError1(){
System.out.println("抛出类型转换异常");
Object str="Leslie";
Integer integer=(Integer)str;
}
public void showError2(){
System.out.println("抛出除零异常");
int i=1/0;
}
public void showError3() throws FileNotFoundException {
System.out.println("抛出文件路径异常");
InputStream in=new FileInputStream("C:/xxx/xxx/xxx.txt");
}
public void showError4(){
System.out.println("抛出空指针异常");
String str=null;
str.length();
}
public void showError5() throws MyException {
System.out.println("抛出自定义异常");
throw new MyException();
}
}
调用产生异常的方法
代码语言:javascript复制@Controller("exceptionController")
public class ExceptionController {
@Autowired
private ExceptionService service;
@RequestMapping("/exception")
public void testError(){
service.showError1();
}
}
实例结果
2. 自定义异常处理器
创建异常处理器类实现HandlerExceptionResolver
代码语言:javascript复制/**
* 自定义异常处理器,实现HandlerExceptionResolver接口
*/
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView=new ModelAndView();
//判断异常种类
if(e instanceof MyException){
modelAndView.addObject("info","自定义异常");
}else if(e instanceof ClassCastException){
modelAndView.addObject("info","类转换异常");
}else{
modelAndView.addObject("info","其他异常");
}
//设定跳转视图
modelAndView.setViewName("error");
return modelAndView;
}
}
配置异常处理器
代码语言:javascript复制<!--配置自定义异常处理器-->
<bean class="cn.ywrby.resolver.MyExceptionResolver"/>
编写异常页面
代码语言:javascript复制<%--
Created by IntelliJ IDEA.
User: renboyu010214
Date: 2021/3/17
Time: 1:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Error1</title>
</head>
<body>
<h1>Error:${info}</h1>
</body>
</html>