1.异常
程序中的异常一般分为两类:预期异常,运行时异常。前者是我们可预知的,我们一般通过捕获和抛出方式处理这些异常。后者主要通过代码规范、测试等手段来减少异常的发生。一般,我们在系统的DAO、Service层的异常都向上抛出,然后统一的在Controller中进行处理。但是每个Controller中的每个方法都写类似的异常处理逻辑,就显得非常的麻烦,并且代码重复。
Spring提供了异常处理器(HandlerExceptionResolver)来处理异常。我们定义好处理异常的逻辑,SpringMVC会在任何的Controller出现异常时,调用我们定义的异常处理逻辑。从而实现异常的统一管理,并且避免了代码的重复。
其异常处理流程如下:
2.非注解使用异常案例.
异常分为自定义异常和运行时异常,这就要分别编写自定义异常和运行时异常。
2.1编写一个controller类,给类方法中出现两个异常,分别是自定义和运行时异常,代码如下:
@RequestMapping("ex/") @Controller public class ExceptionController { @RequestMapping("show/{id}") @ResponseStatus(HttpStatus.OK) public ModelAndView show(@PathVariable("id") Long id) throws MyException{ ModelAndView mv = new ModelAndView("hello"); // 自定义异常 if(id==0){ throw new MyException("自定义异常出现"); } System.out.println("exception"); // 运行时异常 System.out.println(1/0); mv.addObject("msg", "传递参数"+id); return mv; }
2.2如果出现自定义异常,需要处理,需要编写自定义异常类,且继承Exception,代码如下:
package cn.exception; public class MyException extends Exception { /** * 自定义异常 */ private static final long serialVersionUID = 1L; // 提供构造函数 public MyException() { super(); } public MyException(String message) { super(message); } }
2.3.需要定义异常处理器(编写类实现HandlerExceptionResolver )
package cn.exception; import java.io.PrintWriter; import java.io.StringWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; public class MyexceptionResolver implements HandlerExceptionResolver { //异常处理的方法 @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView mv = new ModelAndView("error"); String msg = null; // 判断是否是自定义异常 if(ex instanceof MyException){ msg = ex.getMessage(); }else{ // 如果不是,则获取栈信息 StringWriter out = new StringWriter(); PrintWriter pw = new PrintWriter(out); ex.printStackTrace(pw); msg = out.toString(); } // 添加异常信息到Model mv.addObject("msg", msg); return mv; } }
2.4.在Springmvc配置文件中,配置异常处理器
<!-- 配置异常处理页面 -->
<bean class="cn.exception.MyexceptionResolver"></bean>
2.5.编写异常页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 异常发生了...${msg } </body> </html>
3.非注解使用异常案例.
package cn.controller; import java.io.PrintWriter; import java.io.StringWriter; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; import cn.exception.MyException; @ControllerAdvice public class ExceptionControllerAdvice { // 处理自定义异常 @ExceptionHandler(MyException.class) public ModelAndView zdyException(MyException e){ ModelAndView mv = new ModelAndView("error"); mv.addObject("msg", e.getMessage()); return mv; } // 处理运行时异常 @ExceptionHandler(RuntimeException.class) public ModelAndView zdyException(RuntimeException ex){ ModelAndView mv = new ModelAndView("error"); mv.addObject("msg", ex.getMessage()); StringWriter out = new StringWriter(); PrintWriter pw = new PrintWriter(out); ex.printStackTrace(pw); mv.addObject("msg", out.toString()); return mv; } }
需要提供自定义异常类,见上面MyException