2023年11月29日发(作者:)

E优雅的全局异常处理(模板⼀)

1、⾸先,需要引⼊maven依赖包,如下所⽰:

1 "1.0" encoding="UTF-8"?>

2 "/POM/4.0.0"

3 xmlns:xsi="/2001/XMLSchema-instance"

4 xsi:schemaLocation="/POM/4.0.0 /xsd/">

5 4.0.0

6

7

8 spring-boot-starter-parent

9 2.3.12.RELEASE

10

11

12

13 SpringbootException

14 0.0.1-SNAPSHOT

15 SpringbootException

16 Demo project for Spring Boot

17

18

19 1.8

20

21

22

23

24

25

26 spring-boot-starter-web

27

28

29

30 a

31 fastjson

32 1.2.41

33

34

35

36

37 spring-boot-starter-test

38 test

39

40

41 e

42 junit-vintage-engine

43

44

45

46

47

48

49

50

51

52 spring-boot-maven-plugin

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 }

8Controller 控制层。

控制层这边也⽐较简单,使⽤Restful风格实现的CRUD功能,主要是Restful风格的,根据请求⽅式getpostputdelete,⽽请求路径是⼀个,主要根

据请求⽅式来做区分操作。

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 findByUser(User user) {

50 System.out.println("开始查询...");

51 List userList = new ArrayList<>();

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%完美,但是设计的已经很优秀了,基本可以满⾜⽇常需求,赞⼀个。