MVC目录
- 一. 🦁 前言
- 二. 🦁 控制器异常处理
- Ⅰ. 单个控制器异常处理
- Ⅱ. 全局异常处理
- Ⅲ. 自定义异常处理
- 三. 🦁 最后
一. 🦁 前言
咱们来探索一下控制器异常处理流程,以及如何来实现它。
二. 🦁 控制器异常处理
在系统当中, Dao、Service、Controller层代码出现都可能抛出异常。如果哪里产生异常就在哪里处理,则会降低开发效率。所以一
般情况下我们会让异常向上抛出,最终到达DispatcherServlet中,此时SpringMVC提供了异常处理器进行异常处理,这样可以提高开发效率。
Ⅰ. 单个控制器异常处理
在控制器中定义异常处理方法只能处理该控制器类的异常。
@Controller
public class MyController {
@RequestMapping("/t1")
public String t1(){
String str = null;
// str.length();
// int flag = 1/0;
int[] arr = new int[1];
arr[2] = 10;
return "index";
}
/**
* 异常处理方法
* @param ex 异常对象
* @param model 模型对象
* @return
*/
// 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
@ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
public String exceptionHandle1(Exception ex, Model model){
// 向模型中添加异常对象
model.addAttribute("msg",ex);
// 跳转到异常页面
return "error";
}
// 方法一不能处理的异常交给方法二处理
@ExceptionHandler(java.lang.Exception.class)
public String exceptionHandle2(Exception ex, Model model){
model.addAttribute("msg",ex);
return "error2";
}
}
Ⅱ. 全局异常处理
要想处理所有控制器的异常,需要定义全局异常处理类。
@ControllerAdvice // 全局异常处理器类,需要添加@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 异常处理方法
*
* @param ex 异常对象
* @param model 模型对象
* @return
*/
// 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
@ExceptionHandler({java.lang.NullPointerException.class, java.lang.ArithmeticException.class})
public String exceptionHandle1(Exception ex, Model model) {
// 向模型中添加异常对象
model.addAttribute("msg", ex);
// 跳转到异常页面
return "error";
}
// 方法一不能处理的异常交给方法二处理
@ExceptionHandler(java.lang.Exception.class)
public String exceptionHandle2(Exception ex, Model model) {
model.addAttribute("msg", ex);
return "error2";
}
}
Ⅲ. 自定义异常处理
// 自定义异常处理器实现HandlerExceptionResolver接口,并放入Spring容器中
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if (e instanceof NullPointerException) {
modelAndView.setViewName("error");
} else {
modelAndView.setViewName("error2");
}
modelAndView.addObject("msg", e);
return modelAndView;
}
}
三. 🦁 最后
控制器异常处理,您学会了么,咱们下期见!!!