SpringMVC的异常处理

一、异常分类

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主
要通过规范代码开发、测试通过手段减少运行时异常的发生。

二、SpringMVC异常处理方式

系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。
springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

三、自定义异常处理

1、自定义异常类

对不同的异常类型定义异常类,继承Exception。

public class ItemsException extends Exception {

private String message;//异常信息
//构造方法
public ItemsException(String message){
this.message = message;
}

@Override
public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

2、全局的异常处理器

(1)处理方式:系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。
(2)全局异常处理器处理思路:
 解析出异常类型,如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示,如果该异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
(3)springmvc提供一个HandlerExceptionResolver接口.

public class MyException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) {

ItemsException itemsException = null;
//解析出异常类型
//如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示
if(e instanceof ItemsException){
itemsException =(ItemsException) e;
}else{
//如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
itemsException = new ItemsException("未知错误");
}
//获取异常信息
String message = itemsException.getMessage();
//将异常信息添加到ModelAndView
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message",message);
//将view添加到modelAndView
modelAndView.setViewName("error");
return modelAndView;
}
}

3、编写错误页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>


自定义异常


${message}

4、在SpringMVC的配置文件中配置全局异常处理器

5、异常测试

controller异常:

public ModelAndView queryItemById(@RequestParam(value = "id") Integer item_id) throws Exception{

ItemsCustom itemsExtend = itemsService.queryItesmById(item_id);
if(itemsExtend == null){
throw new ItemsException("商品信息不存在");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsExtend",itemsExtend);
modelAndView.setViewName("updateitem");
return modelAndView;
}
service异常:

@Override
public ItemsCustom queryItesmById(Integer id) throws Exception {
ItemsCustom itemsCustom= itemsMapper.queryItesmById(id);
if(itemsCustom == null){
new ItemsException("商品信息不存在");
}
return itemsCustom;
}

6、测试结果

posted @ 2017-08-14 14:22  一条路上的咸鱼  阅读(346)  评论(0)    收藏  举报