思考的问题在目前的前后端交互中,接口返回方式通常是标准化的,比如返回的接口状态(成功|失败)和返回的数据是在该字段中获取,或者失败后从接口返回提示信息的地方。所以,如果想要做一个全局的异常,并且在异常发生后能够准确的返回给前端进行分析,那么异常发生时返回给前端的格式就需要和正常的一样.故障场景的格式是一致的。项目创建使用idea工具轻松搭建一个SpringBoot项目。需要引入的maven依赖如下:.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtest非常简单。除了添加web功能外,还添加了我们需要使用的JSR-303验证框架。定义成功和失败返回码publicclassCode{/***success*/publicstaticintSUCCESSED=1;/***failure*/publicstaticintFAILED=-1;}定义接口返回响应实体publicclassResponseimplementsSerializable{/****/privatestaticfinallongserialVersionUID=4250719891313555820L;/***返回结果集*/privateTresult;/***返回消息*/privateStringmsg;/***响应码*/privateIntegercode;//省略setget}全局异常拦截和校验定义自定义业务异常publicclassMyExceptionextendsRuntimeException{privatestaticfinallongserialVersionUID=-5875371379845226068L;publicMyException(){}publicMyException(Stringmsg){this.msg=msg;}/***异常信息*/privateStringmsg;/***具体异常代码*/privateintcode=Code.FAILED;getset略写全局异常控制器处理自定义异常@ControllerAdvicepublicclassGlobalExceptionHandler{privateLoggerlogger=LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value=MyException.class)@ResponseBodypublicResponsemyExceptionErrorHandler(MyExceptionextion)throwsExcerptor{"Exceptionextion)throwsExcerptormyExceptionErrorHandlerinfo:{}",ex.getMessage());响应r=newResponse<>();r.setMsg(ex.getMsg());r.setCode(ex.getCode());returnr;}写controller模拟抛业务异常@RestController@RequestMapping("/user")publicclassUserController{@PostMapping(value="/update")Responseupdate(Useruser){//这里的todo是模拟抛出的异常if(true){thrownewMyException("updatefailed");}//这里的todo是一个模拟ReturnResponseresponse=newResponse<>();response.setCode(Code.SUCCESSED);response.setResult(true);returnresponse;}}postMan模拟请求接口验证数据绑定异常处理通常我们操作数据有时候,不仅前端需要进行数据校验,后端也要进行拦截并给出相应的错误提示。JSR-303验证框架也是我们的一个选择。编写实体`User`,并注解属性控制publicclassUser{@NotNull(message="usernamecannotbeempty")privateStringuserName;privateintage;//...添加拦截到全局异常控制类@ControllerAdvicepublicclassGlobalExceptionHandler{privateLoggerlogger=LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value=BindException.class)@ResponseBodypublicResponsebindExceptionErrorHandler(BindExceptionex)throwsException{logger.error("bindExceptionErrorHandlerinfo:{}",ex.getMessage());ResponsenewResponse<>();StringBuildersb=newStringBuilder();FieldErrorfieldError=ex.getFieldError();sb.append(fieldError.getDefaultMessage());r.setMsg(sb.toString());r.setCode(Code.FAILED);returnr;}//...写控制器@RestController@RequestMapping("/user")publicclassUserController{@PostMapping(value="/add")Responseadd(@ValidatedUseruser){//todo这里是模拟返回Responseresponse=newResponse<>();response.setCode(Code.SUCCESSED);response.setResult(newUser());returnresponse;}//...postMan模拟请求不填任何属性,模拟添加操作,准确拦截并报错项目结构预览:最好的结局就是最好的,各队各有各的自己应该找出自己的一套异常解决方案。本文仅针对业务异常。希望每个人都能有所收获。