\345\274\225\346\223\216\345\274\202\345\270\270.md
... ...
@@ -0,0 +1,228 @@
1
+### checked exception 和 unchecked exception
2
+
3
+- checked exception:编译器检查的异常,必须处理
4
+- unchecked exception:运行时异常,编译器不检查的异常
5
+
6
+摒弃checked exception, 全部使用unchecked exception, 使用 RuntimeException 作为所有运行时异常的父类,
7
+
8
+引擎使用 SnestException 作为所有异常的父类.
9
+
10
+### 引擎异常使用
11
+
12
+```java
13
+/**
14
+ * 引擎异常基类,其他异常都需要继承此
15
+ *
16
+ * @author
17
+ */
18
+public class SnestException extends RuntimeException {
19
+
20
+ private ErrorCode errorEnum = ErrorCode.UNKNOWN_EXC;
21
+ private Integer errorCode;
22
+ private String messageFormat;
23
+ private Object[] args;
24
+
25
+ /**
26
+ * 返回国际化翻译过后的错误信息
27
+ *
28
+ * @return
29
+ */
30
+ @Override
31
+ public String getMessage() {
32
+ return this.messageFormat == null ||
33
+ "".equals(this.messageFormat.trim()) ? super.getMessage() : MultiLangUtil.l10n(this.messageFormat, this.args);
34
+ }
35
+
36
+ /**
37
+ * 获取多语言的错误信息(从上下文meta中获取当前语言)
38
+ *
39
+ * @return 多语言的错误信息
40
+ */
41
+ @Override
42
+ public String getLocalizedMessage() {
43
+ return MultiLangUtil.l10n(this.messageFormat, this.args);
44
+ }
45
+}
46
+
47
+```
48
+SnestException 类包含 ErrorCode 枚举,ErrorCode 枚举包含了所有的错误码和错误信息,使用时直接创建即可,SnestException 会自动格式化对应的错误信息。
49
+
50
+![img.png](img.png)
51
+
52
+如果自定义错误信息,SnestException 会自动格式化对应的错误信息。
53
+
54
+![img_1.png](img_1.png)
55
+
56
+如果需要自定义错误码和错误信息,可以继承 SnestException 类,重写 getMessage() 方法,返回自定义的错误信息。
57
+
58
+![img_2.png](img_2.png)
59
+
60
+```java
61
+
62
+public class EngineException extends SnestException {
63
+
64
+ // 定义错误码
65
+ protected static ErrorCode errorEnum = ErrorCode.ENGINE_EXC;
66
+
67
+ public EngineException() {
68
+ super(errorEnum);
69
+ }
70
+
71
+ public EngineException(Throwable cause) {
72
+ super(errorEnum, cause);
73
+ }
74
+
75
+ public EngineException(String message) {
76
+ super(errorEnum.getCode(), message);
77
+ }
78
+
79
+ public EngineException(String message, Throwable cause) {
80
+ super(errorEnum.getCode(), message, cause);
81
+ }
82
+
83
+ public EngineException(String message, int errorCode) {
84
+ super(errorCode, message);
85
+ }
86
+
87
+ public EngineException(int errorCode, String messageFormat, Object... args) {
88
+ super(errorCode, messageFormat, args);
89
+ }
90
+
91
+ public EngineException(String messageFormat, Object... args) {
92
+ super(errorEnum.getCode(), messageFormat, args);
93
+ }
94
+
95
+ public EngineException(Throwable cause, String messageFormat, Object... args) {
96
+ super(cause, errorEnum.getCode(), null, messageFormat, args);
97
+ }
98
+
99
+}
100
+```
101
+### 错误码定义
102
+
103
+```java
104
+
105
+
106
+/**
107
+ * 错误码,统一在此处定义
108
+ *
109
+ * @author xiaomi
110
+ */
111
+public enum ErrorCode {
112
+
113
+ /**
114
+ * 错误日志对照表
115
+ */
116
+ ARGUMENT_NULL_EXC(100, "参数为空异常"),
117
+ DATA_FORMAT_EXC(101, "数据格式异常"),
118
+ VALUE_EXC(105, "值异常(值的范围、格式、类型不符合预期)"),
119
+ DATA_EXC(200, "数据异常,数据持久化失败"),
120
+ DB_EXC(201, "执行DB操作异常"),
121
+ SQL_PARSE_EXC(205, "SQL解析异常"),
122
+ MISSING_EXC(300, "缺失异常(找不到期望的参数、值、对象等)"),
123
+ DATA_MISSING_EXC(335, "数据异常"),
124
+ UNSUPPORTED_EXC(341, "暂不支持异常"),
125
+
126
+ /** 擎相关 */
127
+ ENGINE_EXC(400, "引擎内部异常"),
128
+ UNAUTHORIZED_EXC(401, "未登录"),
129
+ FORBIDDEN_EXC(403, "无权限访问"),
130
+ APP_EXC(405, "APP异常"),
131
+ META_EXC(500, "元模型异常"),
132
+ MODEL_EXC(504, "模型异常"),
133
+ SERVICE_ORCHESTRATE_EXC(505, "元模型异常,元模型定义不符合要求导致建构元模型失败"),
134
+ CALL_EXC(600, "call调用服务(方法)异常"),
135
+ PROXY_EXC(601, "动/静态代理执行异常"),
136
+ REFLECT_EXC(602, "反射执行异常"),
137
+ SIDE_CAR_EXC(630, "分布式sideCar异常"),
138
+ UNKNOWN_EXC(999, "未知异常"),
139
+
140
+ USER_EXC(1000, "用户异常"),
141
+ VALIDATION_EXC(2000, "校验失败"),
142
+ ACCESS_EXC(7000, "访问异常"),
143
+
144
+ REDIS_MODEL_META(10000, "引擎Redis异常"),
145
+ REDIS_FINAL_MODEL(10000, "引擎Redis异常,模型终态数据有误."),
146
+ REDIS_PROPERTY_META(10001, "引擎Redis异常,属性初态数据有误."),
147
+ REDIS_METHOD_META(10002, "引擎Redis异常,方法初态数据有误."),
148
+ REDIS_SERVICE_META(10003, "引擎Redis异常,服务初态数据有误."),
149
+ REDIS_PARAM_META(10004, "引擎Redis异常,服务参数初态数据有误."),
150
+
151
+ SIDE_CAR_NOT_FOUND_APP(15000, "未找到应用: %s"),
152
+ SIDE_CAR_INSTALLING_APP(15001, "正在安装应用: %s"),
153
+ ENGINE_PLUGIN(20000, "引擎插件异常"),
154
+
155
+ // SDK 相关
156
+ SDK_EXC(21000, "SDK异常"),
157
+
158
+ ;
159
+
160
+ private static final Map<Integer, ErrorCode> ERROR_CODE_MAP = convertToErrorCodeMap();
161
+
162
+ private int code;
163
+ private String msg;
164
+
165
+ ErrorCode(int code, String msg) {
166
+ this.code = code;
167
+ this.msg = msg;
168
+ }
169
+
170
+ public int getCode() {
171
+ return code;
172
+ }
173
+
174
+ public void setCode(int code) {
175
+ this.code = code;
176
+ }
177
+
178
+ public String getMsg() {
179
+ return msg;
180
+ }
181
+
182
+ public void setMsg(String msg) {
183
+ this.msg = msg;
184
+ }
185
+
186
+ public static Map<Integer, ErrorCode> getErrorCodeMap() {
187
+ return ERROR_CODE_MAP;
188
+ }
189
+
190
+ private static Map<Integer, ErrorCode> convertToErrorCodeMap() {
191
+ return Arrays.stream(ErrorCode.values()).collect(Collectors.toMap(e -> e.code, Function.identity(), (prev, next) -> next));
192
+ }
193
+}
194
+
195
+
196
+
197
+```
198
+```go
199
+/*
200
+错误码规则:
201
+ xx xx xx
202
+ 两位代表具体的app 两位代表具体app中某个model 具体业务类型的具体的错误类型
203
+
204
+举例:120200
205
+ 12 02 00
206
+ 操作日志app 黑名单类型 黑名单参数异常
207
+*/
208
+
209
+// 公共错误码 10
210
+const (
211
+ ErrUnknown = -1
212
+ ErrOk = 0
213
+ ErrParameterInvalid = 100001
214
+ ErrInternalServerError = 100002
215
+ ErrRequestTimeout = 100003
216
+ ErrCallServiceTimeout = 100004
217
+)
218
+
219
+var errTextMap = map[int]string{
220
+ ErrUnknown: "未知错误",
221
+ ErrOk: "成功",
222
+ ErrParameterInvalid: "请求参数错误",
223
+ ErrInternalServerError: "服务内部错误",
224
+ ErrRequestTimeout: "请求超时,请稍后重试",
225
+ ErrCallServiceTimeout: "调用服务超时",
226
+}
227
+
228
+```
... ...
\ No newline at end of file