版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luo4105/article/details/72326621
在开发中,常会出现各种各样的异常,我们不可能对每个异常都进行处理,那样工作量不仅大,而且不易改动,这就需要对异常进行统一处理,如给出错误提示、打印日志、跳转错误页面等。
SpringMVC处理异常的方式有
1.配置使用SpringMVC的简单异常映射解析器SimpleMappingExceptionResolver,它的作用是把异常解析映射成配置的页面
2.使用自定义的处理异常解析器,需要实现HandlerExceptionResolver。
3.使用@ExceptionHandler(异常处理器)注解实现异常处理
前两种对代码没有侵入型,第一种只是简单映射异常和页面,第二种可以对异常进行处理
Jar包
项目结构
自定义异常
ServiceException
public classServiceException extends RuntimeException {
private static final long serialVersionUID= 1L;
public ServiceException(Strings) {
super(s);
}
}
ControllerException
public classControllerException extends RuntimeException {
private static final long serialVersionUID= 1L;
publicControllerException(String s) {
super(s);
}
}
Controller
@Controller
@RequestMapping("")
public classTestController {
@Autowired(required=false)
private TestService testService;
@RequestMapping("exp")
public String exp(String id) throws Exception {
testService.thorwServiceException(id);
if("1".equals(id)) {
throw new ControllerException("controller exception");
}
return "exp";
}
}
Service
@Service
public classTestService {
public voidthorwServiceException(String id) throwsException {
if("2".equals(id)) {
throw new ServiceException("service异常");
}
}
}
exp.jsp
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<p><a href="exp?id=1">controller抛异常</a></p>
<p><a href="exp?id=2">service抛异常</a></p>
</body>
</html>
在SpringMVC配置文件中加上
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值,会跳转到对应的异常页面 -->
<property name="exceptionMappings">
<props>
<prop key="com.lc.exception.ControllerException">error-contl</prop>
<prop key="com.lc.exception.ServiceException">error-service</prop>
<!-- 这里还可以继续扩展对不同异常类型的处理 -->
</props>
</property>
</bean>
运行、效果
新建EcpHandler类
public classEcpHandler implements HandlerExceptionResolver {
@Override
public ModelAndViewresolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exceptionex) {
Map<String,Object> model= newHashMap<String, Object>();
model.put("ex", ex);
if(ControllerException.class.isInstance(ex)) {
return new ModelAndView("error-contl",model);
}elseif(ex instanceofServiceException) {
return new ModelAndView("error-service", model);
} else {
return null;
}
}
}
在springMVC配置中注册
<bean id="excpHandler"class="com.lc.exception.EcpHandler"/>
运行、效果
@ExceptionHandler这种方式不太常用,故不介绍
使用简单异常映射解析器SimpleMappingExceptionResolver,优点集成是简单,方便、对代码没有入侵性,缺点是不能进行复杂的操作,如记录异常日志。
使用自定义异常处理解析器集成是简单,方便、对代码没有入侵性、也可以对异常进行自定义的处理操作。
参考资料
1.http://blog.csdn.net/ufo2910628/article/details/40399539