技术经验谈 技术经验谈
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hss01248

一号线程序员
首页
  • 最佳实践

    • 抓包
    • 数据库操作
  • ui

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 总纲
  • 整体开发框架
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 编译和自动化

    • gradle基础
    • gradle-task
    • appbundle打包的自动化
    • cmake vs gradle
    • cmake入门
    • gradle依赖管理
    • gradle加速之拉取依赖的加速
    • gradle远程脚本
    • maven
    • 多module时自动发布所有lib
    • 将react native打包成一个aar
  • 异常上报和监测

  • SDK封装方法论
  • 结构化文档一键转代码的实践-埋点-翻译-java api注释
  • 防御式编程例子1-颜色解析工具的处理
    • 遇到有崩溃的情况:
    • 增加鲁棒性和统计功能:
    • api友好化,贴近原生api,以及加上一些注解:@ColorInt,@ColorRes
  • 工程方法
hss01248
2021-12-21
目录

防御式编程例子1-颜色解析工具的处理

# 防御式编程例子1-颜色解析工具的处理

# 前言

一个人的代码水平很大程度体现在对异常情况的处理上.

注重:

可维护性,

安全性(crash free),

业务可用性,

错误自恢复能力

异常在本地和线上可观测

api易用,不误导

# 需求

# 后台下发颜色字符串,app端解析得到颜色值


public static int getColor(String col) {
        return Color.parseColor(col);
    }
1
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

# 增加鲁棒性和统计功能:

提升错误恢复能力,提高可用性


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

# 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

# 这里还可以做的一些选择:

如果这个错误对流程有较大影响,那么可以在开发测试环境直接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
结构化文档一键转代码的实践-埋点-翻译-java api注释

← 结构化文档一键转代码的实践-埋点-翻译-java api注释

最近更新
01
截图后的自动压缩工具
12-27
02
图片视频文件根据exif批量重命名
12-27
03
chatgpt图片识别描述功能
02-20
更多文章>
Theme by Vdoing | Copyright © 2020-2025 | 粤ICP备20041795号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式