1.项目开发中处理异常的思路:
- dao异常通常抛给Service
- Service异常通常抛给Controller
- Controller把异常抛给前端控制器(SpringMVC框架)
- 由前端控制器把异常交给异常处理器进行处理
2.自定义异常处理器
方式1:springmvc的xml方式
- 编写一个异常类,实现处理异常解析器接口HandlerExceptionResolver
- 实现处理异常的方法
- 在springmvc.xml中将异常解析器对象交给springmvc容器管理
方式2:springmvc的注解方式(推荐)
- 编写一个异常类,添加注解@ControllerAdvice
- 编写一个处理异常的方法,在方法上添加注解@ExceptionHandler,通过value属性声明处理那种异常
方式3:web.xml中配置(404和500)
3.代码实现
3.1 springmvc的xml方式实现
1)编写一个异常类,实现处理异常解析器接口HandlerExceptionResolver
2)实现处理异常的方法
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error"); //error是异常页面
if (ex instanceof NullPointerException) {
//如果是空指针异常,可以做针对性处理。通常不需要
modelAndView.addObject("msg", "空指针异常");
}else if(ex instanceof ClassCastException){
//如果是类型转换异常,可以做针对性处理。通常不需要
modelAndView.addObject("msg", "类型转换异常");
}
return modelAndView;
}
}
3)在springmvc.xml中将异常解析器对象交给springmvc容器管理
<bean class="com.itheima.resolver.MyExceptionResolver"/>
3.2 springmvc的注解方式实现(推荐)
1)编写一个异常类,添加注解@ControllerAdvice
2)编写一个处理异常的方法,在方法上添加注解@ExceptionHandler,通过value属性声明处理哪种异常
@ControllerAdvice //异常处理类
public class MyExceptionHandler {
@ExceptionHandler(value = Exception.class) //处理所有的异常
public ModelAndView handlerException(Exception ex){
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
return mv;
}
}
3.3 web.xml中配置(404和500)实现
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/pages/404.jsp</location>
</error-page>