一、背景简介

目前的前后端交互普遍通过 Restful 的形式,而错误处理仅仅通过 HTTP 状态码往往不满足需求;

基于此,我们需要在 HTTP 状态码基础上拓展业务错误码;

本文介绍一种基于 SpringBoot 和 Exception 的实现方案。

二、实验步骤

2.1  生成 SpringBoot 基础项目

SpringBoot 官方提供了初始模板工程,下载地址:https://start.spring.io/

2.2  定义包含错误码的异常

a.  首先,我们需要定义一个 Enum 用于枚举错误码,方便使用和记忆

建立一个 package,如 org.shida.demo.enums

package org.shida.demo.enums;public enum ApiExceptionCode {RESOURCE_NOT_FOUND(101, "Resource not found");private Integer value;private String desc;private ApiExceptionCode(Integer value, String desc) {this.value = value;this.desc = desc;}public Integer getValue() {return value;}public void setValue(Integer value) {this.value = value;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}}

本例中,定义了 RESOURCE_NOT_FOUND ,错误码为 101

b.  然后,定义一个公共异常(父类异常)

建立一个 package,如 org.shida.demo.exception

package org.shida.demo.exception;public class ApiException extends RuntimeException{private static final long serialVersionUID = 1L;private Integer code;public ApiException(Integer code, String msg) {super(msg);this.code = code;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}}

接着,实现真正的异常,ResourceNotFoundException

package org.shida.demo.exception;import org.shida.demo.enums.ApiExceptionCode;public class ResourceNotFoundException extends ApiException{private static final long serialVersionUID = 1L;public ResourceNotFoundException(String msg) {super(ApiExceptionCode.RESOURCE_NOT_FOUND.getValue(), msg);}}

2.3  定义 Controller 异常 处理公共方法

建立一个 package,org.shida.demo.config

package org.shida.demo.config;import javax.servlet.http.HttpServletRequest;import org.shida.demo.exception.ApiException;
import org.shida.demo.exception.ExceptionResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;@ControllerAdvice
public class GlobalExceptionHandler {private final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ResponseBody@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ExceptionHandler(Exception.class)public ExceptionResponse handleException(HttpServletRequest request, Exception ex) {if (ex instanceof ApiException) {log.warn(ex.getMessage(), ex);ApiException apiException = (ApiException) ex;return ExceptionResponse.create(apiException.getCode(), apiException.getMessage());} else {log.error(ex.getMessage(), ex);return ExceptionResponse.create(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());}}}

这里通过判断 异常是否是 ApiException ,分别构造前端响应方式

其中,ExceptionResponse 定义如下,这也是前端最终的异常展示结构,即 code + message 形式

package org.shida.demo.exception;public class ExceptionResponse {private String message;private Integer code;public ExceptionResponse(Integer code, String message) {this.message = message;this.code = code;}public static ExceptionResponse create(Integer code, String message) {return new ExceptionResponse(code, message);}public Integer getCode() {return code;}public String getMessage() {return message;}}

2.4  编写一个简单的 Controller 进行测试

建立一个 package,com.shida.demo.web

package org.shida.demo.web;import org.shida.demo.exception.ResourceNotFoundException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class DemoController {@GetMapping("/demo/{hello}")public String sayHello(@PathVariable String hello) {if (hello.equals("exception")) {throw new ResourceNotFoundException("资源没有找到");} else {return hello;}}}

2.5  启动程序,通过浏览器访问 http://localhost:8080/api/demo/hello

访问 http://localhost:8080/api/demo/exception ,模拟异常发生

客户端,首先通过 HTTP 状态码判断是否出现了错误,

如果出现了错误,进一步可以通过提取 error data 中的 code 判断错误类型,同时提取 message

三、实验代码下载地址

https://pan.baidu.com/s/1bxSSKfOiJM8hOcUJ09SIxA

SpringBoot 使用异常自定义错误码相关推荐

  1. Spring Boot validator参数验证restful自定义错误码响应

    2019独角兽企业重金招聘Python工程师标准>>> 关于spring web应用中关于如何使用 Bean Validation API和hibernate-validator的文 ...

  2. C++异常 返回错误码

    C++异常 返回错误码 参考文章: (1)C++异常 返回错误码 (2)https://www.cnblogs.com/moonlightpoet/p/5670343.html 备忘一下.

  3. SpringBoot自定义错误码,并支持国际化

    实现效果:不同的业务模块用不同的错误编码 一.错误码封装 获取错误信息接口类,所有的错误都要统一实现该接口类 public interface BaseErrorCode {/*** 获取错误码* @ ...

  4. fetion飞信登录异常,错误码10033201、10033202

    新安装的飞信2012,登陆异常. 1.  第一次登陆失败,提示"错误码10033201", 解决方法: 登陆界面 --> 网络设置 --> 更多设置 --> 登陆 ...

  5. java自定义错误码类_如何编写和应用Java的自定义异常类

    11.7.1编写自定义异常类的模式 编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程.常用的编写自定义异常类的模式如下: public class Custo ...

  6. Replace Error Code with Exception(以异常取代错误码)

    某个函数返回一个特定的代码,用来表示某种错误情况 public int withdraw(int amount) {if (amount > balance) {return -1;} else ...

  7. Modbus功能码/异常功能码/错误码

    Modbus协议主要构成是地址码/标识码,功能码,寄存器地址,数据报文等内容.由于modbus协议是请求/应答通信协议,其其中功能码主要用于表述该数据报文执行的功能,当服务器对客户机进行响应时,它使用 ...

  8. mysql 自定义错误码,您可以自定义mysql_error重复错误消息吗?

    I'm getting a "Duplicate entry 'blah' for key 'username'" error message, but I would LOVE ...

  9. java捕获sybase主键重复异常_sybase错误码

    入事务日志文件时出错 3621 –299 语句被用户中断 3702 –214 表正在使用 3702 –215 '%1' 正在使用过程 3702 –750 用户拥有正在使用的过程 3702 –751 用 ...

  10. java异常自定义返回信息,Spring Boot 如何自定义返回错误码错误信息

    说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...

最新文章

  1. PCL:超详细的基于法向量和曲率的区域生长算法原理以及源码解读
  2. 用AI,认识西门子的另一面
  3. mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)
  4. 杭电 汉诺塔问题总结
  5. 研磨设计模式之 策略模式--转
  6. QT的QVectorIterator类的使用
  7. 模板:网络流(Dinic算法)
  8. Linux ifconfig 配置网络接口
  9. java学习(9):巩固练习
  10. “我今年 31 岁,工作 7 年,明年退休...”
  11. 编程环境中Runtime(运行时)的三个含义
  12. input子系统分析二
  13. 用QEMU构建嵌入式LINUX系统
  14. php判断目录是否有写的权限,PHP版目录权限检测
  15. java 上文件传示例_Java解压缩文件示例
  16. iOS/Android·全球
  17. xp+WinDBG+VMware调试内核
  18. 【谷粒商城】全网最全笔记(1/4)
  19. 华为PUSH推送所有Token都不合法
  20. popToViewController:animated:的崩溃

热门文章

  1. win10下OpenJtag驱动安装
  2. 光缆定位仪光衰点定位光纤识别方法
  3. 视频 | 皖南川藏线自驾游
  4. 最近发现谷歌浏览器打开网页速度很慢,比IE都慢
  5. 绿云签约服务的酒店数量超越2万家,同比增长超过15%
  6. html制作中英文双语菜单,CSS实现的中英文双语菜单效果代码
  7. web咸鱼自救攻略--typescript的类没有你想象中的那么难
  8. 陈景润定理的数学证明何处寻?
  9. linux之lzma tar压缩解压命令
  10. CSS3弹性布局、响应式布局、PS