问题的引入:当sevice层或者dao层出现异常,dao层会抛给service层,service层会抛给controller层,controller会抛给前端控制器,前端控制器会直接抛给客户端,为了避免这样的情况发生,需要在前端控制器上对异常进行处理。
处理的步骤:1.自定义异常类。2.编写异常处理器类。3.配置异常处理器
首先来看看不处理异常会是什么效果
controller方法:
@Controller
@RequestMapping("/exception")
public class ExceptionDemo {
@RequestMapping("/test")
public String test() throws SysException{
System.out.println("exceptiontest方法执行");
//模拟异常
int a=4/0;
return "success";
}
}
jsp代码:
<a href="exception/test">异常处理</a><br>
浏览器报错:
这样的效果是非常不友好的
1.首先编写自定义异常:
自定义异常,需要继承Exception
/*
* 异常处理
* 1.自定义异常类
* 2.编写异常处理器类
* 3.配置异常处理器
*/
public class SysException extends Exception{
private static final long serialVersionUID = 1L;
//存储提示信息
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SysException(String message) {//构造器
this.message = message;
}
}
2.编写异常处理器:
需要实现HandlerExceptionResolver接口,此接口中有一个resolveException方法,返回值类型为ModelAndView
public class SysExceptionResovler implements HandlerExceptionResolver{
/*
* 当controller有异常抛过来
*/
public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,Exception arg3) {
//获取异常对象
SysException e=null;//用来接收异常
if(arg3 instanceof SysException){
e=(SysException)arg3;//强制转换
}
else{
e=new SysException("系统正在维护");//自定义异常编写了构造器
}
//创建对象
ModelAndView mav=new ModelAndView();
mav.addObject("errorMsg", e.getMessage());
mav.setViewName("error");
return mav;
}
}
arg3参数即是被抛过来的异常
3.在springmvc.xml中配置异常处理器:
<!--配置异常处理器 -->
<bean id="sysExceptionResovler" class="com.tao.exception.SysExceptionResovler"> </bean>
然后再controller方法中捕获异常,对方法进行异常捕获:
@RequestMapping("/test")
public String test() throws SysException{
System.out.println("exceptiontest方法执行");
//模拟异常
try {
int a=4/0;
} catch (Exception e) {
//控制台打印
e.printStackTrace();
//抛出自定义异常
throw new SysException(" 出错了!");
}
return "success";
}
最终效果:
如果在方法中部队异常进行捕获的话,也就是不加try catch语句块,效果: