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

2023-09-20 17:15:19

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;
    }

}

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

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]
	....

一般接口报错,前端根据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;
    }

抛出运行异常

抛出异常接口调用结果

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

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

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

更多推荐

pytorch环境配置

pytorch安装与基础pytorch相关配置一:安装cuda1:找到nvidiacontrolpanel2:打开控制面板,找到系统信息中的,组件即可查看到cuda版本,这里我的cuda版本为12.0.1503:下载对应版本的cudatoolkit(我下载的12.0.1)4:安装流程5.验证是否安装成功二:配置cuDN

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类,具备参数管理功能。例如:nn.Linear,nn.Flatten,nn.Dropout,nn.BatchNorm2d,nn.Embeddingnn.Conv2d,nn.AvgPool2d,nn.Con

Go并发可视化解释 – select语句

上周,我发布了一篇关于如何直观解释Golang中通道(Channel)的文章。如果你对通道仍然感到困惑,请先查看那篇文章。Go并发可视化解释—Channel作为一个快速复习:Partier、Candier和Stringer经营着一家咖啡店。Partier负责接受顾客的订单,然后将这些订单传递给厨房,Candier和St

go学习-基本知识点

string转[]byte通用的转换会发生内存拷贝,但是如下利用unsafe.Pointer实现的强转则不需要拷贝funcTestDemo(t*testing.T){a:="aaa"b:="bbbbbbb"//ssh是a的内存地址//通过将字符串的底层地址强制转换成StringHead结构来获取字符串的底层指针和长度/

kafka消费者模式

一、单线程消费者模式packagenj.zb.kb23.kafka;importorg.apache.kafka.clients.consumer.ConsumerConfig;importorg.apache.kafka.clients.consumer.ConsumerRecord;importorg.apache

Python与数据分析--Matplotlib-2

目录1.写在文前2.实例1--武汉新冠趋势图3.简单散点图实例4.灵活散点图实例5.饼图操作实例1.写在文前"""Matplotlib库我们大致已经学完了,但是缺乏一定的实战经验。今天我们就来进行一下matplotlib的实战操作。"""#导入对应的库函数importnumpyasnpimportmatplotlib.

day40 设计模式、jdk8新特性

一、代理模式为其他对象提供一种代理控制此对象的访问若一个对象不适合直接引用另一个对象,代理对象在客户端和目标对象之间起到中介作用组成:抽象角色:通过接口抽象类真实角色实现了哪些方法代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法可以附加自己的操作真实角色:实现抽象角色,定义业务逻辑,供

【Redis 多机服务的简单认识】

目录主从同步哨兵模式集群服务随着业务的不断发展,单机Redis的性能已经不能满⾜我们的需求了,此时我们需要将单机Redis扩展为多机服务,Redis多机服务主要包含以下3个内容:Redis主从同步Redis哨兵模式Redis集群服务(Redis3.0新增功能)主从同步主从同步(主从复制)是Redis⾼可⽤服务的基⽯,也

OpenCV(三十八):二维码检测

1.二维码识别原理功能图形:位置探测图形:通常,二维码中有三个位置探测图形,呈现L型或大角度十字架形状,分布在二维码的三个角上,用于帮助扫描设备定位二维码的位置和方向。位置探测图形分隔符:帮助扫描设备区分位置探测图形和二维码的数据区域。计算模式:通常是一个小的正方形图案,用于校准扫描设备以捕捉和解码二维码的图像。对齐标

jQuery 框架学习笔记(基础)

WhatjQuery是一种快速、简洁跨游览器的JavaScript函数库,其宗旨是“Writeless,Domore”,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。注意:jQuery不是将所有的JS封装,只是有选择性的封装

观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)

文章目录观察者模式运用实现观察者模式定义:他用来定义对象之间一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖他的对象都会得到通知运用如果我们使用过DOM上的事件函数,那就接触过观察者模式document.body.addEventListener("click",function(){console.log("

热文推荐