第一种
通过SimpleMappingExceptionResolver类来定义,springmvc.xml内容
自定义的异常可以继承Exception类
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 遇到异常时默认跳转的视图 error其实是error.jsp是视图-->
<property name="defaultErrorView" value="error"/>
<!-- 抛出异常后在页面可用 ${errMsg.message} 读出异常信息 -->
<property name="exceptionAttribute" value="errMsg"/>
<!-- 自定义的异常转向页面可自定义多个而实现不同异常转向不同页面 -->
<property name="exceptionMappings">
<props>
<prop key="com.samrtian.exception.CustomException">error1</prop>
</props>
</property>
</bean>
第二种
通过实现HandlerExceptionResolver接口来定义
springmvc.xml内容
<!-- 全局异常处理器 -->
<bean class="com.samrtian.exception.CustomExceptionResolver"></bean>
接口实现 CustomException是继承了Exception类的自定义异常.
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
// TODO Auto-generated method stub
CustomException customException = null;
if (ex instanceof CustomException) {
customException = (CustomException)ex;
}else{
customException = new CustomException("未知错误!");
}
String errMsg = customException.getMessage();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("error", errMsg);
modelAndView.setViewName("error");
return modelAndView;
}
}
第三种
使用@ExceptionHandler 注解定义
这个更简单了直接在控制器里加入方法,但是必须跟抛异常的方法在同一个控制器里
@Controller
public class LoginAction {
@ExceptionHandler(CustomException.class)
public String catchException(CustomException e, HttpServletRequest request) {
System.out.println("进来了");
request.setAttribute("errMsg", "注解的异常");
return "error";
}
@RequestMapping("/login.do")
public ModelAndView login(int id) throws Exception {
// TODO Auto-generated method stub
if (id == 1) {
throw new CustomException("自定义的异常");
}
if (id == 2) {
throw new Exception("Exception的异常");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("LoginSuccess");
return modelAndView;
}
个人比较偏好第一种,简单明了