ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringMVC 全局异常统一处理

2022-01-21 21:02:32  阅读:128  来源: 互联网

标签:code SpringMVC codeMap ExceptionHandler put msg 全局 异常 public


SpringMVC 异常统一处理的三种方式:

  1. 使用@ExceptionHandler 注解
  2. 实现 HandlerExceptionResolver 接口
  3. 使用 @ControllerAdvice注解

总结:

  当以下三个方式,一起出现时,只执行范围最小的方式,后面的方式不再执行处理;

  执行范围:@ExceptionHandler < @ControllerAdvice + @E..Handler < HandlerExceptionResolver

  人话:当某个Mapping发生异常后,先有@ExceptionHandler处理;如果没有上者,则由@ControllerAdvice + @E..Handle 处理;如果没有上者,则由HandlerExceptionResolver 处理

  •  使用@ExceptionHandler注解
    • 作用域:局部,针对一个Controller中的指定异常类:
    • 注有该注解的方法,和发生异常的Mapping方法,两者需要在同一个Controller里面;
       1 @RestController
       2 public class TestExceptionController {
       3 
       4     @RequestMapping("/testEx01")
       5     public Map testEx01(){
       6         Map codeMap = new HashMap();
       7         int i = 9/0;
       8         codeMap.put("code",200);
       9         codeMap.put("msg","ok");
      10         return codeMap;
      11     }
      12     // @ExceptionHandler 参数为 要处理器的 异常类(或子类)
      13     @ExceptionHandler(ArithmeticException.class)
      14     public Map exInfo(ArithmeticException e){
      15         Map codeMap = new HashMap();
      16         System.out.println(e.getMessage());
      17         codeMap.put("code",700);
      18         codeMap.put("msg","分母不能为0");
      19         return codeMap;
      20     }
      21 
      22 }
  • 使用HandlerExceptionResolver 接口(前后端分离项目不使用)
    • 作用域:全局,针对全部Controller,无需指定某个异常类;
    • HandlerExceptionResolver 接口中,只有resolveException 一个方法,实现即可;
       1 //作用域:全局,针对全部Controller,无需指定某个异常类
       2 @Component
       3 public class HandlerEx implements HandlerExceptionResolver {
       4     @Override
       5     public ModelAndView resolveException(HttpServletRequest httpServletRequest,
       6                                          HttpServletResponse httpServletResponse, Object o, Exception e) {
       7         System.out.println(e.getMessage());
       8         ModelAndView mv = new ModelAndView();
       9         mv.setViewName("/systemException");
      10         return mv;
      11     }
      12 }
  • 使用 @ControllerAdvice 注解(可以用于前后端分离项目,经常使用的)
    • 作用域:全局,针对全部 Controller 中的指定异常类;
    • 该注解需要 和 @ExceptionHandler 配合,来完成全局异常的处理;
    • 注意:两个注解的配合,发生异常 Mapping 方法 与 @ExceptionHandler 注解的方法,就可以不用卸载用一个Controller 里;
       1 //统一 异常的通知
       2 @RestControllerAdvice   //restController 的通知
       3 public class ZDYExceptionAdvice {
       4 
       5     @ExceptionHandler(Exception.class)
       6     public Map showInfoE(Exception e){
       7         System.out.println(" 统一异常 ");
       8         System.out.println(e.getMessage());
       9 
      10         Map codeMap = new HashMap();
      11         codeMap.put("code",800);
      12         codeMap.put("msg","系统繁忙!!");
      13         return codeMap;
      14     }
      15 
      16     // @ExceptionHandler 参数为 要处理器的 异常类(或子类)
      17     // 注解参数不声明指定异常类,则默认为方法列表中的异常参数类
      18     @ExceptionHandler(ArithmeticException.class)
      19     public Map showInfo(Exception e){
      20         System.out.println(" 算数异常 ");
      21         System.out.println(e.getMessage());
      22 
      23         Map codeMap = new HashMap();
      24         codeMap.put("code",800);
      25         codeMap.put("msg","你不能把分母设置为0");
      26         return codeMap;
      27     }
      28 
      29     //自定义 异常
      30     @ExceptionHandler(ZDYException.class)
      31     public Map zdyException(ZDYException e){
      32         System.out.println(e.getMsg());
      33 
      34         Map codeMap = new HashMap();
      35         codeMap.put("code",e.getCode());
      36         codeMap.put("msg",e.getMsg());
      37         return codeMap;
      38     }
      39 }

      自定义异常:

       1 //测试 自定义异常
       2     @RequestMapping("/testEx03")
       3     public Map zdyEx(int x,int y){
       4         Map codeMap = new HashMap();
       5         if (y == 0) {
       6             throw new ZDYException(1111,"自定义异常");
       7         }
       8         int i = x/y;
       9         codeMap.put("code",200);
      10         codeMap.put("msg","ok");
      11         codeMap.put("data",i);
      12         return codeMap;
      13     }

      需要继承 RuntimeException:

       1 //自定义异常
       2 public class ZDYException extends RuntimeException{
       3     private int code;
       4     private String msg;
       5 
       6     public ZDYException() {
       7     }
       8 
       9     public ZDYException(int code, String msg) {
      10         this.code = code;
      11         this.msg = msg;
      12     }
      13 
      14     public int getCode() {
      15         return code;
      16     }
      17 
      18     public void setCode(int code) {
      19         this.code = code;
      20     }
      21 
      22     public String getMsg() {
      23         return msg;
      24     }
      25 
      26     public void setMsg(String msg) {
      27         this.msg = msg;
      28     }
      29 }

标签:code,SpringMVC,codeMap,ExceptionHandler,put,msg,全局,异常,public
来源: https://www.cnblogs.com/zhgking/p/15829842.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有