• SpringMVC入门宝典(八)SpringMVC异常处理


    目录

    一.单个控制器异常处理

    二.全局异常处理

    三.自定义异常处理器


    一.单个控制器异常处理

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

    处理单个 Controller 的异常:
    1. package com.first.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.ui.Model;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. @Controller
    7. public class MyController {
    8. @RequestMapping("/t1")
    9. public String t1(){
    10. String str = null;
    11. //str.length();//空指针异常
    12. // int flag = 1/0; //数学逻辑异常
    13. int[] arr = new int[1];
    14. arr[2] = 10; //越界异常
    15. return "index";
    16. }
    17. /**
    18. * 异常处理方法
    19. * @param ex
    20. * @param model
    21. * @return
    22. */
    23. //添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类(这里设置为空指针异常和数学逻辑异常)
    24. @ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
    25. public String exceptionHandle1(Exception ex,Model model){
    26. //向模型添加异常对象
    27. model.addAttribute("msg",ex);
    28. //跳转到异常页面
    29. return "error";
    30. }
    31. //方法一不能处理的异常交给方法二处理,即处理除了空指针异常和数学逻辑异常以外的异常
    32. @ExceptionHandler(java.lang.Exception.class)
    33. public String exceptionHandle2(Exception ex,Model model){
    34. //向模型添加异常对象
    35. model.addAttribute("msg",ex);
    36. //跳转到异常页面
    37. return "error2";
    38. }
    39. }
    异常页面 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>
    异常页面 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>

    二.全局异常处理

    在控制器中定义异常处理方法只能处理该控制器类的异常,要想处理所有控制器的异常,需要定义全局异常处理类。 全局异常处理器类,需要添加@ControllerAdvice
    1
    1.编写另一个有异常的控制器类
    1. package com.first.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.ui.Model;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. @Controller
    7. public class MyController2 {
    8. @RequestMapping("/t2")
    9. public String t2(){
    10. int[] arr = new int[1];
    11. arr[2] = 10;
    12. return "index";
    13. }
    14. }
    2.编写全局异常处理器类
    1. package com.first.controller;
    2. import org.springframework.ui.Model;
    3. import org.springframework.web.bind.annotation.ControllerAdvice;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. //全局异常处理器类,需要添加@ControllerAdvice
    6. @ControllerAdvice
    7. public class GlobalExceptionHandler {
    8. /**
    9. * 异常处理方法
    10. *
    11. * @param ex 异常对象
    12. * @param model 模型对象
    13. * @return
    14. */
    15. // 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
    16. @ExceptionHandler({java.lang.NullPointerException.class, java.lang.ArithmeticException.class})
    17. public String exceptionHandle1(Exception ex, Model model) {
    18. // 向模型中添加异常对象
    19. model.addAttribute("msg", ex);
    20. // 跳转到异常页面
    21. return "error";
    22. }
    23. // 方法一不能处理的异常交给方法二处理
    24. @ExceptionHandler(java.lang.Exception.class)
    25. public String exceptionHandle2(Exception ex, Model model) {
    26. model.addAttribute("msg", ex);
    27. return "error2";
    28. }
    29. }

    访问 http://localhost:8080/t2

    三.自定义异常处理器

    自定义异常处理器需要实现HandLerExceptionResolver。

    以上方式都是使用的 SpringMVC 自带的异常处理器进行异常处理,我们还可以自定义异常处理器处理异常:
    1. package com.first.controller;
    2. import org.springframework.stereotype.Component;
    3. import org.springframework.web.servlet.HandlerExceptionResolver;
    4. import org.springframework.web.servlet.ModelAndView;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. // 自定义异常处理器实现HandlerExceptionResolver接口,并放入Spring容器中
    8. @Component
    9. public class MyExceptionHandler implements HandlerExceptionResolver {
    10. @Override
    11. public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
    12. ModelAndView modelAndView = new ModelAndView();
    13. if(e instanceof NullPointerException){
    14. //跳转
    15. modelAndView.setViewName("error");
    16. }else{
    17. modelAndView.setViewName("error2");
    18. }
    19. //向modelAndView中添加数据
    20. modelAndView.addObject("msg",e);
    21. return modelAndView;
    22. }
    23. }

    访问 http://localhost:8080/t2 http://localhost:8080/t1 试试。

  • 相关阅读:
    在pycharm中运行js文件,附加node.js下载步骤
    WebGL着色器快速教程
    R语言 PPT 预习+复习
    【深入浅出程序设计竞赛(基础篇)第四章 算法从0开始】
    【网络安全】安全事件管理处置 — 应急响应简介
    JavaScript语法基础03
    99%的亚马逊运营都不知道爆单小技巧——社媒促销代码
    如何安装Vue
    47. 参加科学大会(第六期模拟笔试)(最短路)
    BUUCTF Misc 黑客帝国 & [MRCTF2020]你能看懂音符吗 & [HBNIS2018]caesar & [HBNIS2018]低个头
  • 原文地址:https://blog.csdn.net/weixin_44593822/article/details/125624084