2023年11月29日发(作者:)
E优雅的全局异常处理(模板⼀)
1、⾸先,需要引⼊maven依赖包,如下所⽰:
1 "1.0" encoding="UTF-8"?> 2 3 xmlns:xsi="/2001/XMLSchema-instance" 4 xsi:schemaLocation="/POM/4.0.0 /xsd/"> 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 SpringBoot中有⼀个ControllerAdvice的注解,使⽤该注解表⽰开启了全局异常的捕获,我们只需再⾃定义⼀个⽅法,然后使⽤ExceptionHandler注解, 在该注解的value属性⾥⾯,定义捕获异常的类型,即可对这些捕获的异常进⾏统⼀的处理。 2、⾃定义基础接⼝类。 ⾸先定义⼀个基础的接⼝类,⾃定义的错误描述枚举类需实现该接⼝。 1 package ; 2 3 public interface BaseErrorInfoInterface { 4 5 // 错误码 6 public String getResultCode(); 7 8 // 错误描述 9 public String getResultMsg(); 10 11 } 3、⾃定义枚举类。 然后我们这⾥在⾃定义⼀个枚举类,并实现该接⼝。⽽使⽤枚举类的好处是处理异常的时候,可以通过枚举类直接获取到错误码、错误描述,⽅便调 ⽤。 1 package ; 2 3 public enum CommonEnum implements BaseErrorInfoInterface { 4 5 // 数据操作错误定义 6 SUCCESS("200", "接⼝调⽤成功!"), 7 8 BODY_NOT_MATCH("400", "请求的数据格式不符!"), 9 10 SIGNATURE_NOT_MATCH("401", "请求的数字签名不匹配!"), 11 12 NOT_FOUND("404", "未找到该资源!"), 13 14 INTERNAL_SERVER_ERROR("500", "服务器内部错误!"), 15 31 return resultCode; 32 } 33 34 @Override 35 public String getResultMsg() { 36 return resultMsg; 37 } 38 39 } 4、⾃定义异常类。 然后我们在来⾃定义⼀个异常类,⽤于处理我们发⽣的业务异常。 1 package ion; 2 3 import rorInfoInterface; 4 5 public class BizException extends RuntimeException { 6 7 /** 8 * 9 */ 10 private static final long serialVersionUID = -6329783845738305585L; 11 12 // 错误码 13 protected String errorCode; 14 // 错误信息 15 protected String errorMsg; 16 17 public BizException() { 18 super(); 19 } 20 21 public BizException(BaseErrorInfoInterface errorInfoInterface) { 22 super(ultCode()); 23 this.errorCode = ultCode(); 24 this.errorMsg = ultMsg(); 28 } 29 30 public void setCode(String code) { 31 this.code = code; 32 } 33 34 public String getMessage() { 35 return message; 36 } 37 38 public void setMessage(String message) { 39 this.message = message; 40 } 41 42 public Object getResult() { 43 return result; 44 } 45 46 public void setResult(Object result) { 47 this.result = result; 48 } 49 50 /** 51 * 成功 52 * 53 * @return 54 */ 55 public static ResultBody success() { 56 return success(null); 57 } 58 59 /** 60 * 成功 61 * 62 * @param data 63 * @return 64 */ 65 public static ResultBody success(Object data) { 66 ResultBody rb = new ResultBody(); 67 e(ultCode()); 68 sage(ultMsg()); 69 ult(data); 70 return rb; 71 } 72 73 /** 74 * 失败 75 */ 76 public static ResultBody error(BaseErrorInfoInterface errorInfo) { 34 * 处理空指针的异常 35 * 36 * @param req 37 * @param e 38 * @return 39 */ 40 @ExceptionHandler(value = NullPointerException.class) 41 @ResponseBody 42 public ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e) { 43 ("发⽣空指针异常!原因是:", e); 44 return (_NOT_MATCH); 45 } 46 47 /** 48 * 处理其他异常 49 * 50 * @param req 51 * @param e 52 * @return 53 */ 54 @ExceptionHandler(value = Exception.class) 55 @ResponseBody 56 public ResultBody exceptionHandler(HttpServletRequest req, Exception e) { 57 ("未知异常!原因是:", e); 58 return (AL_SERVER_ERROR); 59 } 60 61 } 7、创建⼀个⽤户的实体类,如下所⽰: 1 package ; 2 3 import izable; 4 5 import ject; 6 7 public class User implements Serializable { 8 9 /** 10 * 11 */ 12 private static final long serialVersionUID = 1365558L; 13 14 // 编号 15 private int id; 16 // 姓名 17 private String name; 18 // 年龄 19 private int age; 20 21 public User() { 22 } 23 24 public int getId() { 25 return id; 26 } 27 28 public void setId(int id) { 29 this.id = id; 30 } 31 32 public String getName() { 33 return name; 34 } 35 36 public void setName(String name) { 37 this.name = name; 38 } 39 40 public int getAge() { 41 return age; 42 } 43 44 public void setAge(int age) { 45 this.age = age; 46 } 47 48 public String toString() { 49 return String(this); 50 } 51 52 } 8、Controller 控制层。 控制层这边也⽐较简单,使⽤Restful风格实现的CRUD功能,主要是Restful风格的,根据请求⽅式get、post、put、delete,⽽请求路径是⼀个,主要根 据请求⽅式来做区分操作。 1 package ller; 2 3 import ist; 33 System.out.println("开始更新..."); 34 // 这⾥故意造成⼀个空指针的异常,并且不进⾏处理 35 String str = null; 36 ("111"); 37 return true; 38 } 39 40 @DeleteMapping("/user") 41 public boolean delete(@RequestBody User user) { 42 System.out.println("开始删除..."); 43 // 这⾥故意造成⼀个异常,并且不进⾏处理 44 nt("abc123"); 45 return true; 46 } 47 48 @GetMapping("/user") 49 public List 50 System.out.println("开始查询..."); 51 List 52 User user2 = new User(); 53 (1); 54 e("xuwujing"); 55 (18); 56 (user2); 57 return userList; 58 } 59 60 } 9、接⼝功能测试,使⽤postman进⾏测试,如下所⽰: 9.1、⾸先进⾏查询,查看程序是否正常运⾏,使⽤GET ⽅式进⾏请求,如下所⽰: 9.2、进⾏插⼊操作,使⽤POST⽅式进⾏请求,如下所⽰: 9.3、进⾏修改操作,使⽤PUT⽅式进⾏请求,如下所⽰: 9.4、进⾏删除操作,使⽤DELETE⽅式进⾏请求,如下所⽰: 10、整体思路解析,按照步骤操作,按道理来说,这个思路是很优秀的,那么下⾯来分析⼀下这个设计思路。 10.1、在⾃⼰的⽅法中抛出⾃定义异常,⽽抛出的⾃定义异常是被全局异常类进⾏捕获处理的。 对抛出的⾃定义异常,在全局异常处理类中进⾏处理,然后返回的信息,是封装到⾃定义数据格式类中的,这样返回给前端的数据格式,就可以根据⾃ ⼰的需求进⾏设计。 虽然,这种设计不能说100%完美,但是设计的已经很优秀了,基本可以满⾜⽇常需求,赞⼀个。


发布评论