给产品经理讲技术|应用续命大法之异常捕获

一般的情况下我们认为程序如果在运行中发生异常,就会崩溃挂掉,程序被迫需要重启,这时我们会在心中狠狠鄙视程序员。

其实程序员开发的应用经常需要在未知而又危险的环境中运行的,因为程序员是在一台机器上写的程序,实际能够测试的机器只是少部分,而应用一旦发布出去,会在成千上万甚至亿级别的机器上运行,即便是相同型号的机器,因为当时运行的环境问题,实际状态也是有所差异,比如内存消耗状态,CUP负荷,甚至还有来自其它应用的干扰。

一个初生的应用在没有发布出去的时候,团队内部往往感觉良好,用着都挺顺,没有崩溃什么的,可是一旦发出去,反馈页面上就会有大量可用性的吐槽————“怎么没点两下就挂了”“靠,启动就挂”。其实这就是运行环境的差异导致的没有预料到的异常。

程序在运行过程中遇到异常很正常,很多异常程序员是不容易预料到的。比如将内存中的数据保存到文件中、向后台发了一次数据请求、调用了一个系统提供的接口来获取一些信息等等,这些业务代码看起来没什么特别的,也是经常使用的,但是记住危险无处不在:

比如写文件的时间比较长,这个过程中外存设备被移除了,或者其它的应用在清理垃圾,正好把你写的文件当垃圾文件删除掉了;

比如在向后台发送数据请求的时候使用的端口被别的进程占用了,或者网络请求的权限被用户关闭掉了;

比如调用了系统的接口来获取设备信息,但是有的平台这个接口没有暴露,或者定制的系统擅自修改了系统接口的实现,但是没有充分测试,非常不稳定;

一旦应用开始铺量,这些看似小的场景就会被不断发大,造成各种奇葩的崩溃。而实际运行环境中可能遇到的异常远比上面举例的要多的多,也复杂的多,即使经验丰富的程序员也难全都预料。所以在实际开发的过程中,这些异常导致的程序崩溃都会通过上报系统反馈给开发者,开发者看到这些上报也会恍然大悟————原来还有这个坑。

知道了这些异常怎么办呢,如果要做针对性的处理,逻辑太复杂了,有的又是特定平台提供的接口本身有问题,但是开发者又不想这些奇葩问题影响程序的稳定性,以及处理这些异常带来的程序逻辑复杂度,所以这里就需要一种特殊的处理手段————异常捕获。

很多高级语言都提供了异常捕获的能力,异常捕获就是开发者知道程序运行到这里可能会挂,但是又没什么好办法处理,于是用异常捕获的方式强行让程序运行过去而不挂,如果这里对程序后面运行影响不大,那么程序还能保持健康状态的继续运行下去。

比如有段原始代码:

String id = SystemInterface.getID();

这段代码是调用系统提供的函数来获取设备的ID(伪代码),它在绝大部分机器上运行良好,但是有些2B厂商自己改了getID的实现,又没有充分测试,导致这个接口被调用的时候会挂掉,但是又不能用因为少部分机器会挂掉就不调用这个接口了,这个损害了大部分人的体验。那么可以用异常捕获来处理:

try

{

String id = SystemInterface.getID();

}

catch(Exception e)

{

// do nothing;

}

可以看到这用try catch将原来的代码给包裹起来了,如果getID没有出现异常,那么就按照原来的逻辑走,如果getID出现了异常,那也被这段捕获代码给裹住了,导致的结果是id没有正确赋值,但程序不会挂掉,后续的代码也都能执行,程序得以续命。

但是这里需要注意的是这个id没有正确赋值可能导致的后果,如果影响比较小,比如只是在系统信息展示界面作为一个条目显示给用户看,那如果出现了异常,这个条目显示的就是空的了,这种结果是程序员和用户都可以接受的。

如果对产生的异常没有做正确的评估和相应处理,虽然程序在这里不会挂掉,但是如果后续的逻辑极度依赖这里的id的值,那么这里做的异常捕获只是苟延残喘而已,只是把异常产生的地方又向后挪了下而已,简单来说就是这里不挂,后面也会挂。如果完全不顾逻辑的进行异常捕获,那么程序虽然不会挂掉,但是应用已经面目全非,无法正常使用了。

实际上异常捕获就跟赶羊一样,进行捕获就相当于羊走偏了,被你注意到了,你还得用鞭子把它赶回正道(就是在catch中做一些弥补的逻辑,让程序能够尽可能的回到正道上运行),如果捕获了却什么也不做,那么应用会在不断的try中一次又一次的走向未知逻辑,最后彻底迷失自己。监控后台统计的crash次数越来越少,用户会发现应用展现出各种奇葩的末日景象却怎么都不挂,应用开发者想找到问题的根源完全没有头绪————程序已经在错误的路上走远了。

用异常捕获来为应用续命可好可坏,合理使用能提高程序的健壮性,做到跌倒不哭,站起来接着撸,但是一旦滥用。。。

(小撸怡情,大撸伤身)

关键字:产品经理, CUP, 高级语言, 捕获

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部