编码Tips1-及时抛出错误

在我们日常的编码过程中,异常算是我们的老朋友了,虽然它给我们的程序带来了 Crash,让我们烦恼无比,但是它也有它存在的道理,只要我们能合理的使用它,我们的代码也会变的更加健壮。

class MainPage {
    private var mMode = MODE_HOME

    // 其它的一堆代码

    fun setMode(mode: Int) {
        if (!isSupportMode(mode)) {
            throw IllegalStateException("不支持的 mode!")
        }
        mMode = mode
    }

    fun refreshPage() {
        when (mMode) {
            MODE_HOME -> {
                // do something
            }
            MODE_USER_INFO -> {
                // do something
            }
            MODE_SETTINGS -> {
                // do something
            }
            else -> {
                throw IllegalStateException("不支持的 mode!")
            }
        }
    }

    companion object {
        const val MODE_HOME = 0
        const val MODE_USER_INFO = 1
        const val MODE_SETTINGS = 2

        fun isSupportMode(mode: Int): Boolean = mode == MODE_HOME
                || mode == MODE_USER_INFO
                || mode == MODE_SETTINGS
    }
}

在上面对这个例子中,我们在执行 setMode、refreshPage 函数时,我们对 mode 可能存在的非预期情况进行了检查,如果它的值并不是我们预期的 MODE_HOME、MODE_USER_INFO、MODE_SETTINGS 三个值之一,这个时候我们一般可以有两种处理方式:

  • 如果 mode 我们没有办法对其进行恢复(设置成一个正确值),或者这个值还有多处依赖,我们恢复了也没办法通知到所有的使用范围,这时候,及时抛出异常,及时止损,因为我们可以认为现在这个不可恢复的错误能被捕获到最根源的地方就是 setMode 和 refreshPage 这两个个函数调用时,如果我们不抛出异常,让这个错误就这么过去了,那么我们后面可能就会引发其它更严重的问题,而且非常难查,因为新出现的问题是由其它的问题引起的,我们面对新问题的时候很难发现产生这个问题的根本问题,这时候可能不管你怎么解 BUG 都解不完,只能重新 review 全部的代码。

  • 如果 mModel 可以恢复,那就简单了,及时恢复吧。

这里可能会有些疑问,我们平时写代码都是尽可能的避免 Crash,那你这里为啥还主动抛出异常让程序 Crash 掉呢?

其实这里我们是有先决条件的,当程序进入到不可恢复的状态了,这时候我们要尽快的结束程序,避免引发更多更复杂的问题,及时止损,当然如果程序可以恢复,我们也应当尽可能的采用返回值的形式拦截错误并恢复,从而保证用户体验。另外我们可以想到,类似于这种问题,一般都是由于我们编码不严谨导致的,换句话说也就是代码写的有漏洞,这时候我们及时抛出异常就非常有利于我们自身发现问题,在自测或者是测试人员测试的环节,这类问题也更容易暴露出来,从而使我们最终上线的代码更加健壮。

在我之前维护的一个项目里,就老是出现很多奇奇怪怪难以解决的问题,最后在 review 整体代码的时候,发现很多之前维护的人在面对问题的时候,都是直接 Try Catch 捕获一下就完事了,该抛出异常的地方就啥也不干,只要不崩溃,就万事大吉,线上的代码从而变得十分的脆弱,进而引发数据不一致、页面恢复错误、用户数据丢失等等问题,最终这块代码因为质量太差,内容又多,只能被完全推翻重写,浪费了人力物力,也造成了很多用户的损失。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,...
    中娅沙漏阅读 573评论 0 5
  • 那一轮幽月 是相思结成的果 从想你的那一刻开始萌芽 随着思念的滋长 而日渐丰盈
    丝丝入画阅读 121评论 14 9
  • 山外山,楼外楼,一条宽敞的大马路连接着一座一座的城。麦田的路很长,无数的城市坐落在道路两侧。我的路也很长,才刚刚从...
    晓楼一夜阅读 686评论 7 5
  • 对于“苟非吾之所有,虽一毫而莫取”这句话,我是同意其观点的。这句话原意为“不是我自己的东西,即使有一点也不要...
    Ao轩阅读 401评论 0 0
  • 从卡萨到丹吉尔到艾西拉,再从艾西拉回卡萨是我们四天自由行的安排。为了减少语言上沟通的困难,出发前一周就在马蜂窝定了...
    陶陶点滴阅读 306评论 0 1