网站首页 > java教程 正文
异常处理是开发过程中不可或缺的一部分,用户希望看到一个可以接受的错误信息,开发运维人员也希望可以看到详细的错误信息。因此在开发过程中,应重视异常处理。
异常处理过程中有几个常见的乱象,例如没有固定的规范,定义名称不同导致前后端各一套异常处理逻辑,重复代码增多。或者后端直接捕获异常,将日志打印到控制台。后台一旦出错,用户得不到任何提示信息。如果没有人特意去查看服务端的日志,甚至都不会有人发现异常。因此,我们要学会设计异常处理,避免发生乱象。
设计异常处理
设计好异常处理后,用户可以清晰的读懂错误原因。后端返回给前端的数据有统一的规范。后端只需要捕获异常并将异常转换成自定义异常对外抛出。运维将异常信息合理规范的持久化,以日志的形式存储起来,方便查询。(自定义异常就要求程序员对运行时异常进行解释)
规范
拦截异常转换为自定义异常必须全部抛出 |
统一数据响应代码,使用http状态码,不能自定义 |
不能对父类Excetion统一catch,要分小类catch |
在自定义异常的过程中要有好的描述异常情况 |
在com.javafamily.familydemo下创建exception文件夹
枚举异常的类型
为了防止开发人员各有各的异常处理标准,我们需要规定好枚举异常类型:
package com.javafamily.familydemo.exception;
public enum PetsExceptionType {
USER_INPUT_ERROR(400, "输入的数据错误"),
SYSTEM_ERROR(500, "系统出现异常"),
OTHER_ERROR(999, "系统出现未知异常");
// code
private int code;
// 异常类型中文描述
private String desc;
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
PetsExceptionType(int code, String desc) {
this.code = code;
this.desc = desc;
}
}1234567891011121314151617181920212223242526复制代码类型:[java]
自定义异常
自定义异常继承RuntimeException:
package com.javafamily.familydemo.exception;
public class PetsException extends RuntimeException {
// 错误编码
private int code;
// 异常信息,提供友好的描述
private String message;
// 所有的异常创建都是通过固化下来的枚举创建的,开发者不能随意创建,所以这里使用private的无参构造
private PetsException() {
}
public PetsException(PetsExceptionType exceptionTypeEnum) {
this.code = exceptionTypeEnum.getCode();
this.message = exceptionTypeEnum.getDesc();
}
public PetsException(PetsExceptionType exceptionTypeEnum,
String message) {
this.code = exceptionTypeEnum.getCode();
this.message = message;
}
public int getCode() {
return code;
}
@Override
public String getMessage() {
return message;
}
}1234567891011121314151617181920212223242526272829303132复制代码类型:[java]
请求接口统一响应数据结构
解决不同的开发人员使用不同的结构来响应给前端,导致规范不统一,开发混乱的问题:
package com.javafamily.familydemo.exception;
import lombok.Data;
@Data
public class ExceptionResponse {
// 请求是否处理成功
private boolean isok;
// 请求响应状态码
private int code;
// 请求结果描述信息
private String message;
// 请求结果数据(通常用于查询操作)
private Object data;
private ExceptionResponse() {
}
// 出现异常时响应数据封装
public static ExceptionResponse error(PetsException e) {
ExceptionResponse resultBean = new ExceptionResponse();
resultBean.setIsok(false);
resultBean.setCode(e.getCode());
resultBean.setMessage(e.getMessage());
return resultBean;
}
public static ExceptionResponse error(PetsExceptionType petsExceptionType,
String errorMessage) {
ExceptionResponse resultBean = new ExceptionResponse();
resultBean.setIsok(false);
resultBean.setCode(petsExceptionType.getCode());
resultBean.setMessage(errorMessage);
return resultBean;
}
// 请求成功的响应,不带查询数据(增删改)
public static ExceptionResponse success() {
ExceptionResponse exceptionResponse = new ExceptionResponse();
exceptionResponse.setIsok(true);
exceptionResponse.setCode(200);
exceptionResponse.setMessage("SUCCESS!");
return exceptionResponse;
}
// 请求成功的响应(查)
public static ExceptionResponse success(Object obj) {
ExceptionResponse exceptionResponse = new ExceptionResponse();
exceptionResponse.setIsok(true);
exceptionResponse.setCode(200);
exceptionResponse.setMessage("SUCCESS!");
exceptionResponse.setData(obj);
return exceptionResponse;
}
// 请求成功的响应(查)
public static ExceptionResponse success(Object obj, String message) {
ExceptionResponse exceptionResponse = new ExceptionResponse();
exceptionResponse.setIsok(true);
exceptionResponse.setCode(200);
exceptionResponse.setMessage(message);
exceptionResponse.setData(obj);
return exceptionResponse;
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566复制代码类型:[java]
请求成功的情况下,ExceptionResponse.success()构建返回结果给前端。
查询/请求等返回业务数据请求成功的情况下使用ExceptionResponse.success(data)构建返回结果给前端。
请求处理过程发生异常,将异常转换为PetsException,在控制层使用ExceptionResponseerror(PetsException)构建返回结果给前端。
判断某些条件为请求失败使用ExceptionResponseerror(petsExceptionType,errorMessage)构建响应结果。
猜你喜欢
- 2024-11-06 Java核心知识3:异常机制详解(java的三种核心机制是什么)
- 2024-11-06 【Spring系列】05 自定义异常以及全局异常处理器 #java
- 2024-11-06 3种Sentinel自定义异常,你用过几种?
- 2024-11-06 关于Java Exception异常的深入用法及实例
- 2024-11-06 Java-throw异常详解以及过程(java throw exception)
- 2024-11-06 《JAVA编程思想》5分钟速成:第12章(异常)
- 2024-11-06 面试官:java开发中异常怎么定义好 程序员:不知道
- 2024-11-06 「译」11条Java异常处理的最佳实践
- 2024-11-06 Java入门教程十一(异常处理)(java异常处理的三种方法)
- 2024-11-06 Java,你管这叫异常?(java异常是什么意思)
你 发表评论:
欢迎- 05-16SpringBoot整合Redis实现常用功能
- 05-16基于Redis实现简单的延时消息队列
- 05-16安装Redis
- 05-16Spring系列之Redis的两种集成方式
- 05-16Django连接Redis集群问题排查思路和总结
- 05-16只需5分钟,完成Redis所有命令操作~
- 05-16熟练使用 Redis 的 5 大数据结构:Java 实战教程
- 05-16Redis 常见业务场景及实例(Java)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)