防御式编程例子1-颜色解析工具的处理
# 防御式编程例子1-颜色解析工具的处理
# 前言
一个人的代码水平很大程度体现在对异常情况的处理上.
注重:
可维护性,
安全性(crash free),
业务可用性,
错误自恢复能力
异常在本地和线上可观测
api易用,不误导
# 需求
# 后台下发颜色字符串,app端解析得到颜色值
public static int getColor(String col) {
return Color.parseColor(col);
}
1
2
3
4
2
3
4
# 遇到有崩溃的情况:
public static int getColorSafely(String colorString) {
int color = 0;
try {
color = Color.parseColor(colorString);
} catch (Exception e) {
e.printStackTrace();
LogUtil.d(e.getMessage());
}
return color;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 增加鲁棒性和统计功能:
提升错误恢复能力,提高可用性
public static int getColorSafely(String colorString, int defaultColor) {
int color = defaultColor;
try {
color = Color.parseColor(colorString);
} catch (Exception e) {
if (!colorString.startsWith("#")){
//如果不是以#开头,就加#再重试,以兼容运营忘了输入#而其他颜色值对的情况,以增加程序鲁棒性
colorString = "#"+colorString;
getColorSafely(colorString, color);
}else {
String msg = e.getMessage() +", colorString:"+colorString;
//构建自定义的异常,上报到统计平台,便于监测此类异常,从而快速反馈到业务处
ExceptionReporter.reportException(new ColorParseException(msg));
}
}
return color;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# api友好化,贴近原生api,以及加上一些注解:@ColorInt,@ColorRes
public static int parseColor(String colorString){
return parseColor(colorString, Color.WHITE);
}
public static int parseColorDefaultRes(String colorString,@ColorRes int defaultColorRes){
return parseColor(colorString, getColor(defaultColorRes));
}
public static int parseColor(String colorString,@ColorInt int defaultColor) {
int color = defaultColor;
try {
color = Color.parseColor(colorString);
} catch (Exception e) {
if (!colorString.startsWith("#")){
//即使后续我们这边处理好了,可能其他端忘了兼容,所以也监测一下这种异常情况
ExceptionReporter.reportException(new ColorNotFormattedException(colorString));
//如果不是以#开头,就加#再重试,以兼容运营忘了输入#而其他颜色值对的情况,以增加程序鲁棒性
colorString = "#"+colorString;
parseColor(colorString, color);
}else {
String msg = e.getMessage() +", colorString:"+colorString;
//构建自定义的异常,上报到统计平台,便于监测此类异常,从而快速反馈到业务处
ExceptionReporter.reportException(new ColorParseException(msg));
//todo 检查defaultcolor的有效性:
}
}
//日志打印,观察在debug环境的效果
LogUtil.w("color",color+",str:"+colorString);
return color;
}
1
2
3
4
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
2
3
4
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
# 这里还可以做的一些选择:
如果这个错误对流程有较大影响,那么可以在开发测试环境直接throw Exception让app崩溃,以快速发现问题
线上环境才降级为exception.
# 后续要做的一些事情:
1 全局替换掉原裸调Color.parseColor(colorString)的地方,尤其是后台动态返回字符串的地方
2 查看其他parse类型是否会存在问题:
Interger.parseInt等几个基本类型包装类的转换,Uri.parse(), JSON.parserObject()等等
3 建议其他前端(ios,web,rn)也这么做,以及要求console增加校验等等
编辑 (opens new window)
上次更新: 2022/08/25, 20:20:31