• 06 SpringMVC异常处理


    目录

    一、SpringMVC异常处理_单个控制器异常处理

    1.空指针异常 NullPointerException(普通异常):

    2.数学异常 ArithmeticException(普通异常):

    3.数组越界异常(严重异常):

    二、SpringMVC异常处理_全局异常处理

    三、SpringMVC异常处理_自定义异常处理

    四、知识点整理:


    项目结构:

     

    一、SpringMVC异常处理_单个控制器异常处理

     在系统当中, DaoServiceController层代码出现都可能抛出异常。如果哪里产生异常就在哪里处理,则会降低开发效率。所以一般情况下我们会让异常向上抛出,最终到达DispatcherServlet中,此时SpringMVC提供了异常处理器进行异常处理,这样可以提高开发效率。

     大致流程:客户端向前端控制器发送请求,前端控制器把请求转发给Controller控制层,Controller控制层调用Service服务层,Service服务层再调用Dao接口层,不管是哪层出现异常,都会将异常向上抛出,即Dao层把异常向Service层抛出,Service层把异常向Controller层抛出,Controller层把异常向DispatcherServlet前端控制器抛出,最终把异常抛到SpringMVC提供的异常处理器中。

    处理单个Controller的异常

    1.空指针异常 NullPointerException(普通异常):

    (1)编写Controller控制器

    1. @Controller
    2. public class MyController {
    3. @RequestMapping("/t1")
    4. public String t1(){
    5. //报空指针异常
    6. String str = null;
    7. str.length();
    8. return "index";
    9. }
    10. /**
    11. * 异常处理方法
    12. * @param ex 异常对象
    13. * @param model 模型对象
    14. * @return
    15. */
    16. //添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
    17. @ExceptionHandler(java.lang.NullPointerException.class)
    18. public String exceptionHandler(Exception ex, Model model){
    19. //向模型中添加异常对象
    20. model.addAttribute("msg",ex);
    21. //跳转到异常页面
    22. return "error";
    23. }
    24. }

    (2)编写jsp表单 error.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>出错了!title>
    5. head>
    6. <body>
    7. <h3>ERROR 发生异常! ${msg}h3>
    8. body>
    9. html>

    (3)请求结果:

         可以看到,当我们访问t1时,由于产生了空指针异常,所以会调用异常方法exceptionHandler,因为异常方法exceptionHandler方法的属性为NullPointerException,处理空指针异常的方法。然后就会跳转到error表单。

    2.数学异常 ArithmeticException(普通异常):

    (1)编写Controller控制器

    1. @Controller
    2. public class MyController {
    3. @RequestMapping("/t1")
    4. public String t1(){
    5. //报空指针异常
    6. String str = null;
    7. // str.length();
    8. //报数学异常
    9. int flag = 1/0;
    10. return "index";
    11. }
    12. /**
    13. * 异常处理方法
    14. * @param ex 异常对象
    15. * @param model 模型对象
    16. * @return
    17. */
    18. //添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
    19. //当添加多个属性时,用{}大括号包起来
    20. @ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
    21. public String exceptionHandler(Exception ex, Model model){
    22. //向模型中添加异常对象
    23. model.addAttribute("msg",ex);
    24. //跳转到异常页面
    25. return "error";
    26. }
    27. }

    (2)jsp表单 error.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>出错了!title>
    5. head>
    6. <body>
    7. <h3>ERROR 发生异常! ${msg}h3>
    8. body>
    9. html>

    (3)请求结果:

      可以看到,当我们访问t1时,由于产生了数学异常,所以会调用异常方法exceptionHandler,因为异常方法exceptionHandler方法的属性为ArithmeticException,处理数学异常的方法。然后就会跳转到error表单。

    3.数组越界异常(严重异常):

    (1)编写Controller控制器

    1. @Controller
    2. public class MyController {
    3. @RequestMapping("/t1")
    4. public String t1(){
    5. //报空指针异常
    6. String str = null;
    7. // str.length();
    8. //报数学异常
    9. // int flag = 1/0;
    10. int[] arr = new int[1];
    11. //报数组越界异常
    12. arr[2] = 10;
    13. return "index";
    14. }
    15. /**
    16. * 异常处理方法一
    17. * @param ex 异常对象
    18. * @param model 模型对象
    19. * @return
    20. */
    21. //添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
    22. //当添加多个属性时,用{}大括号包起来
    23. @ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
    24. public String exceptionHandler(Exception ex, Model model){
    25. //向模型中添加异常对象
    26. model.addAttribute("msg",ex);
    27. //跳转到异常页面
    28. return "error";
    29. }
    30. //方法一不能处理的异常交给方法二处理
    31. @ExceptionHandler(java.lang.Exception.class)
    32. public String exceptionHandler2(Exception ex, Model model){
    33. //向模型中添加异常对象
    34. model.addAttribute("msg",ex);
    35. //跳转到异常页面
    36. return "error2";
    37. }
    38. }

    (2)编写jsp表单 error2.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>出错了!title>
    5. head>
    6. <body>
    7. <h3>ERROR2 发生严重异常! ${msg}h3>
    8. body>
    9. html>

    (3)请求结果:

     可以看到,当我们访问t1时,由于产生了数组越界异常,所以会调用异常方法exceptionHandler2,因为异常方法exceptionHandler方法的属性为Exception,处理异常的方法。然后就会跳转到error2表单。

    二、SpringMVC异常处理_全局异常处理

     在单个控制器中定义异常处理方法只能处理那一个控制器类的异常,要想处理所有控制器的异常,需要定义全局异常处理类。

    1.编写有异常的控制器类MyController2

    1. @Controller
    2. public class MyController2 {
    3. @RequestMapping("/t2")
    4. public String t2() {
    5. int[] arr = new int[1];
    6. //报数组越界异常
    7. arr[2] = 10;
    8. return "index";
    9. }
    10. }

    2.在Controller层编写全局异常处理器类GlobalExceptionHandler

    1. //全局异常处理器类,需要添加@ControllerAdvice
    2. @ControllerAdvice
    3. public class GlobalExceptionHandler {
    4. /**
    5. * 异常处理方法一
    6. * @param ex 异常对象
    7. * @param model 模型对象
    8. * @return
    9. */
    10. //添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
    11. //当添加多个属性时,用{}大括号包起来
    12. @ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
    13. public String exceptionHandler(Exception ex, Model model){
    14. //向模型中添加异常对象
    15. model.addAttribute("msg",ex);
    16. //跳转到异常页面
    17. return "error";
    18. }
    19. //方法一不能处理的异常交给方法二处理
    20. @ExceptionHandler(java.lang.Exception.class)
    21. public String exceptionHandler2(Exception ex, Model model){
    22. //向模型中添加异常对象
    23. model.addAttribute("msg",ex);
    24. //跳转到异常页面
    25. return "error2";
    26. }
    27. }

    3.jsp表单error、error2

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>出错了!title>
    5. head>
    6. <body>
    7. <h3>ERROR 发生异常! ${msg}h3>
    8. body>
    9. html>
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>出错了!title>
    5. head>
    6. <body>
    7. <h3>ERROR2 发生严重异常! ${msg}h3>
    8. body>
    9. html>

    4.请求结果:

    三、SpringMVC异常处理_自定义异常处理

     以上方式都是使用的SpringMVC自带的异常处理器进行异常处理, 我们还可以自定义异常处理器处理异常:

    1.编写自定义异常处理类MyExceptionHandler

    1. //自定义异常处理器实现HandlerExceptionResolver接口,并放入Spring容器中
    2. @Component
    3. public class MyExceptionHandler implements HandlerExceptionResolver {
    4. @Override
    5. public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
    6. ModelAndView modelAndView = new ModelAndView();
    7. if (e instanceof NullPointerException){
    8. modelAndView.setViewName("error");
    9. }else {
    10. modelAndView.setViewName("error2");
    11. }
    12. modelAndView.addObject("msg",e);
    13. return modelAndView;
    14. }
    15. }

    2.jsp表单error、error2

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>出错了!title>
    5. head>
    6. <body>
    7. <h3>ERROR 发生异常! ${msg}h3>
    8. body>
    9. html>
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>出错了!title>
    5. head>
    6. <body>
    7. <h3>ERROR2 发生严重异常! ${msg}h3>
    8. body>
    9. html>

    3.请求结果:

    使用自定义异常处理类进行异常处理,用ModelAndView对象,和SpringMVC提供的异常处理器差不多。 

    四、知识点整理:

    1. SpringMVC中,方法上方添加 @ExceptionHandler 表示该方法是处理异常的方法

    2.SpringMVC中,类上方添加@ControllerAdvice 表示该类为全局异常处理器类

    3.SpringMVC中,自定义异常处理器需要实现HandlerExceptionResolver 接口

  • 相关阅读:
    竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶
    面试题:说一下Redis中有哪些阻塞点以及如何解决?
    在汽车行业中如何脱颖而出?使用聊天机器人是关键
    万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!
    听我劝,自学游戏建模真的很难
    第十天-自动化办公-word操作
    oracle-OVER(PARTITION BY... ORDER BY...)的使用
    攻防演练-组织沙盘推演的4个阶段.
    大佬神作!Spring Security从应用到源码,这份手册都讲全了,已三刷
    创客匠人助力职教机构快速实现数字化经营
  • 原文地址:https://blog.csdn.net/m0_51697147/article/details/126638877