• 优化系统报错提示信息,提高人机交互(一)


    1、常规报错及处理

    package com.example.demo.controller;
    
    import com.example.demo.service.IDemoService;
    import lombok.AllArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @AllArgsConstructor
    @RestController
    @Slf4j
    public class DemoController {
    
        private IDemoService demoService;
    
        @GetMapping("exceptionTest")
        public Integer exceptionTest(){
            Integer result = 0;
            Integer integer1 = 0;
            Integer integer2 = 2;
            result = integer2/integer1;
            return result;
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    调用接口,返回结果如下:
    调用者得到的反馈信息
    服务器端报错:

    java.lang.ArithmeticException: / by zero
    	at com.example.demo.controller.DemoController.exceptionTest(DemoController.java:21) ~[classes/:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    	....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    一般接口报错,前端根据status为500可判断出服务器端报错,但是无法判定什么原因,这时候只能联系后端服务,后端根据日志判断出代码的DemoController.java:21出现bug,然后修复bug,更新程序解决问题。
    这个示例中的问题明显是程序的bug,这样解决起来无可厚非,但是如果是一些复杂的系统,需要用户按照一定流程,需要进行一些配置,如果用户在某些环节操作不当,导致其他模块出错,那么这时候可以判定是系统没有错,是用户的使用问题,这时候接口不能只返回服务器报错,但是前端无法给用户一些提示信息和错误的原因,告知客户哪些地方操作不对,需要更改配置或者做一下前置操作,那么如何优化呢?
    (1)加一些判断,在调用当前接口处理某些逻辑事,如果发生错误,先捕获异常,然后在catch代码块判断前置条件是否满足,不满足则返回提示信息;
    (2)捕获异常并处理,返回提示信息
    (3)前端在调接口前,先调一个验证接口,通过再调目标接口,如常规字段的验证,前端利用js即可完成

    返回信息,有2种:第一种是在参数中返回,这种比较简单,对于一些简单的操作可采用;第二种则是抛出异常,代替参数返回,如上面的接口,发生错误,系统抛出异常,代替了接口自身返回String的方式

    2、错误处理提示示例
    接口修改下,2个整数相除,第二个参数除以第一个参数,返回结果
    (1)对异常进行捕获,并抛出异常

    @GetMapping("exceptionTest")
        public Integer exceptionTest(Integer integer1,Integer integer2){
            Integer result = 0;
            try {
                result = integer2/integer1;
            } catch (Exception e) {
                if (0 == integer1){
                    throw new RuntimeException("除数不能为0");
                }
    
            }
            return result;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    抛出运行异常

    抛出异常接口调用结果

    发现抛出异常,但是到不了前端,这种时候前端可以判断作为除数的数,是否为0,如果为0,则直接提示,做好校验。那么假如前端不做校验,后端接口应该怎么处理呢?能不能优化

    经过一番优化,达到了下面的效果
    优化效果
    这样接口返回了报错原因,前端可以提示给用户,提高了人机交互。

    具体怎么实现的,请继续查看另一篇:优化系统报错提示信息,提高人机交互(二)

  • 相关阅读:
    视频前处理:时域滤波MCTF技术学习
    稀土掺杂氟化物纳米荧光微球/稀土荧光磁性纳米微球Fe3O4@PHEMA-RE的制备方法
    svn问题集
    matlab GUI制作界面的一些笔记(入门)
    掼蛋—算牌高手的博弈
    (脑肿瘤分割笔记:六十二)缺失模态下的对抗性联合训练脑肿瘤分割网络
    IDEA中使用注解Test
    java springBoot实现RabbitMq消息队列 生产者,消费者
    Matlab使用cftool进行曲线拟合
    Springboot2.3.12集成swagger2.10.5时出现的问题
  • 原文地址:https://blog.csdn.net/juligang320/article/details/133071227