zoukankan      html  css  js  c++  java
  • 自定义异常springMVC&springCloud

    一,springMVC自定义异常的处理方式

    异常抛到Controller集中统一处理:

    controller中出现异常0/1

     1 @Controller
     2 @RequestMapping("/test")
     3 public class TestController {
     4 
     5 
     6     /**
     7      * 返回值的前缀: 加上前缀 视图解析器不会再拼接前缀和后缀
     8      *      redirect: 重定向
     9      *      forward: 请求转发
    10      * @return
    11      */
    12     @RequestMapping("/testString")
    13     public String testString(){
    14         System.out.println(1/0);
    15         return "redirect:testModelAndView";
    16     }
    17 
    18 
    19 
    20 
    21 
    22 
    23 }

    异常处理类(解析异常resolve)

    指定一个返回给用户的友好提示信息

    指定一个跳转的error.jsp

    程序员还能自己在控制台看什么异常

    
            ex.printStackTrace();
    @Component
    public class MyHandlerException implements HandlerExceptionResolver {
        /**
         * 解析异常
         * @param request   请求对象
         * @param response  响应
         * @param handler  处理器
         * @param ex 捕获到的异常对象
         * @return  模型和视图对象
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    
            ex.printStackTrace();
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("message","系统错误,请联系管理员!!");
            modelAndView.setViewName("error");
    
            return modelAndView;
        }
    }

    spring-mvc.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xmlns:mvc="http://www.springframework.org/schema/mvc"
     6        xsi:schemaLocation="http://www.springframework.org/schema/beans
     7        http://www.springframework.org/schema/beans/spring-beans.xsd
     8        http://www.springframework.org/schema/context
     9        http://www.springframework.org/schema/context/spring-context.xsd
    10        http://www.springframework.org/schema/mvc
    11        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    12     <!--开启注解扫描-->
    13     <context:component-scan base-package="com.example"></context:component-scan>
    14 
    15     <!--视图解析器-->
    16     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    17         <property name="prefix" value="/WEB-INF/"></property>
    18         <property name="suffix" value=".jsp"></property>
    19     </bean>
    20     <!--mvc注解驱动: 自动加载了处理映射器处理适配器-->
    21     <mvc:annotation-driven></mvc:annotation-driven>
    22 </beans>

    error.jsp在WEB-INF中

    <%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        ${message}
    </body>
    </html>

    二,springcloud自定义异常的处理方式

    问题背景

    代码冗余,try-catch太多不合适。

    用户体验不好例如用户操作返回‘’操作失败‘’,不清楚具体是什么异常

    解决

    所有异常由全局异常处理器捕获(@ControllerAdvice),捕获后分两种情况:

    1.自定义异常(CustomerException)不应继承Exception,因为对代码有侵入性,还要继续抛,所以继承RunTimeException,

    2.不可预知异常系统级别(空指针,连接超时。。。),异常类当做key,value是友好信息。

    若查询的异常类没在map返回特定的信息,若异常类在map中的key存在,则返回value提示。

    (一)自定义异常例子

    执行顺序1-》2中抛出了一个4CustomerException类-》被3抓住,3中的特定handler处理此异常,获取异常信息,返回给用户特定信息。

    1异常处

    ExceptionCast.cast(Code.EXIT)。

    2ExceptionCast类(异常抛出类)和
    3ExceptionCatch(抓取类)
    1 public class ExceptionCast {
    2 public static void cast(ResultCode resultCode){
    3     throw new CustomerException(resultCode);
    4 
    5 }
    6 
    7 
    8 }
     1 @ControllerAdvice
     2 @Slf4j
     3 public class ExceptionCatch {
     4     @ExceptionHandler(CustomerException.class)
     5     public ResponseResult customerException(CustomerException customerException){
     6 
     7         ResultCode resultCode = customerException.getResultCode();
     8         ResponseResult responseResult = new ResponseResult(resultCode);
     9     return  responseResult;
    10     }
    4CustomerException类(抛出的异常类)
    public class CustomerException extends RuntimeException {
        private ResultCode resultCode;
        public ResultCode getResultCode(){
            return resultCode;
    
        }
        public CustomerException(ResultCode resultCode){
            super("错误代码"+resultCode.code()+"错误信息:"+resultCode.message());
            this.resultCode =resultCode;
    
        }
    }

    (二)系统级别的例子

    抓取不可预知的异常,信息用log输出,

    @Slf4j

    后期方便定位问题,info。warning,error日志的常见级别

     1 @ControllerAdvice
     2 @Slf4j
     3 public class ExceptionCatch {
     4  
     5 @ExceptionHandler(Exception.class)
     6     public ResponseResult exception(Exception exception){
     7         log.error(exception.getMessage());
     8         return null;
     9 
    10 }
    11 
    12 }

    特定异常添加到特定map中(谷歌提供的)

    ImmutableMap
    //全局异常抓取类
    @ControllerAdvice //增强controller
    @Slf4j
    public class ExceptionCatch {
    
        //ImmutableMap 线程安全,声明之后内容不可变
        private static ImmutableMap<Class<? extends Throwable>,ResultCode> EXCEPTIONS;
    
        protected static ImmutableMap.Builder<Class<? extends Throwable>,ResultCode> builder = ImmutableMap.builder();
    
        //抓取自定义异常(可预知异常)
        @ExceptionHandler(CustomerException.class)
        @ResponseBody
        public ResponseResult customerException(CustomerException customerException){
            //给用户返回友好信息
            ResultCode resultCode = customerException.getResultCode();
    
            ResponseResult responseResult = new ResponseResult(resultCode);
            return responseResult;
        }
    
        //抓取不可预知异常
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public ResponseResult exception(Exception exception){
    
            log.error(exception.getMessage());
    
            if (EXCEPTIONS == null){
                EXCEPTIONS = builder.build();
            }
            ResultCode resultCode = EXCEPTIONS.get(exception.getClass());
            if (resultCode == null){
                return new ResponseResult(CommonCode.SERVER_ERROR);
            }else{
                return new ResponseResult(resultCode);
            }
    
        }
    
        static {
            builder.put(HttpMessageNotReadableException.class, CommonCode.INVALIDATE_PARAMS);
        }
    }

    从map中找,有,返回key对应的value,没有的话返回固定的友好提示:服务器繁忙。

    当一个男人不再对你啰嗦,不再缠着你,不再没事找你,对你说话也客气了,也不再气你了。那么恭喜你,你已经成功的失去了他。别嫌弃男人幼稚,那是他喜欢你,爱你。女人说男人像小孩子一样不成熟,可又有谁知道,男人在自己喜欢的女人面前才像小孩子,如果不喜欢你了,不爱你了,他比你爸还成熟。
  • 相关阅读:
    Python入门基础知识点(基础数据类型之字典)
    Python入门基础知识点(基础数据类型之二)
    Python入门基础知识点(基础数据类型)
    Python入门基础知识点(循环语句和编码)
    Python入门基础知识点(基础语法介绍)
    接口继承
    类的继承
    类的组合
    静态属性、类方法、静态方法
    类与对象属性的操作
  • 原文地址:https://www.cnblogs.com/fengtangjiang/p/11111200.html
Copyright © 2011-2022 走看看