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 zeroat 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,则直接提示,做好校验。那么假如前端不做校验,后端接口应该怎么处理呢?能不能优化
经过一番优化,达到了下面的效果
这样接口返回了报错原因,前端可以提示给用户,提高了人机交互。
具体怎么实现的,请继续查看另一篇:优化系统报错提示信息,提高人机交互(二)