消灭bug秘籍 如何处理大型软件中的错误和异常

【51CTO.com快译】 "我在测试中没有发现任何bug,这就意味着没有bug……对吗?"千万不要这样认为。由于大型软件的复杂程度很高,不管你做了多少测试,都不可能达到零bug的程度。因为你并不能揣测出用户的所有使用方式,因此,了解应用程序中错误和异常之间的差异,是非常重要的。为此,你要选择正确的方式来处理这些错误和异常,以积极的态度来确保应用的正常运行,对你的开发团队和最终用户负责。

测试的本身亦是个问题

即便你的测试是最彻底的,你依然只是在测试特定的情况,而且自己的偏好也在测试过程中发挥着作用,使得测试本身的客观性有失偏颇。
想象一下,数以千记的用户同时使用你的应用程序,同时也是以数以千计的方式来进行操作,这当中一定会遇到你没有测试过的状况。

如何正确处理应用程序中的错误

简单的说,bug会导致错误和异常,这些错误和异常在不同的条件下有不同的意义,这要看你更看中哪一方面的问题。最主要的问题当然是如何更好的处理这些错误和异常,这样才不会带来消极的后果。

首先,让我们来看一些定义,以及为什么这些差异很重要。

错误和例外有什么区别?

一些编程语言对错误和异常有自己的定义,但我想定义这种差异。

先说错误。编程错误,通常无法继续和恢复,需要程序员进入程序并且修改代码来修复。有时候错误会转化为异常,以便它们可以在代码中被处理。错误可以通过简单的检查来避免,如果一些简单的检查不够,错误也可以转换为异常来处理,这样一来,应用程序就可以解决问题和保持起码的运行。

再说异常。当异常发生时,要考虑到不同编程语言的特性。异常可以被忽略或者捕获,所以代码可以恢复和处理这些情况,而不会令应用程序进入"错误"的状态。由于异常可以被忽略,所以应用程序在这种时候依然可以保持运行,未处理异常(这是错误的)也可以登录,所以,是否处理这些潜在异常就要看开发者了。来看看一些事例。

事例1:一个用户错误

当用户输入了错误的数据,可能暂时不需要太去处理,但这仍然可能导致程序出现错误和不可恢复的状态。毫无疑问,这时代码应该进行简单的检查来阻止错误状态的发生,你应该进行前端和后端的验证,抛出一个异常作为"最后的防御"。

事例2:文件打不开/下载异常

这是一种特殊情况,不至于破坏你的整个应用程序。你的应用程序应该能够处理这个问题。造成下载失败的原因很多,所以在程序设定的过程中,要做充足的预料和准备。Ok,以上就是我定义的错误与异常的区别了,这是易于遵循的过程,帮助你更好的处理错误。

重视每一个异常

"如果我捕获了每个异常,我的代码就是零差错了,对吗?"

就像我在前文中提到的,不是所有的错误都会导致异常。这个结论的主要问题是,你不知道什么是错的。你的代码可能有一些问题,通过捕捉异常而不做任何事情,您将丢失这些信息。不要只是查找异常,然后就一切如常。查找异常的目的是处理它们,并创造更适合运行的环境。

如何对应用程序进行代码自行恢复

抛出和捕获异常是让应用程序自行恢复,并防止它运行到错误状态的一个好方法。如果你知道哪种异常可能被抛出,最好明确被捕获的各种异常都会导致哪种应用程序的停滞。(我们谈了一点关于软件构架错误报告的问题)

说到具体的异常类型,你可以向用户搜集反馈信息,这样你就知道具体导致程序出错的原因,就可以更好的处理这些情况了。

为什么说指定捕获的异常类型很重要

随着程序的运行,某些异常会损坏数据或以非正常的的方式运行。这会导致应用程序出错。如果你确切知道发生了哪些异常,您应该知道要遵循哪些步骤来恢复。或者,如果你无法恢复,你应该知道如何很好的处理这个情况。

那么,这能够恢复吗?很多时候,异常有足够的信息来知道出错了,在被捕获的异常中,有时可以从错误状态中恢复。你可以通过修复一些数据,数据重新获取,甚至要求用户再试一次来实现这一点。

你可以捕捉异常,但有时程序仍然无法运行,因为你依赖的数据已经以一种不可恢复的形式损坏,或者这些异常需要以不同的方式来解决。

比如,一个超出范围的数组异常,程序如何从中恢复?这是一个将错误转化为异常的示例。你的应用程序希望数据以某种方式存在,但这并没有发生。虽然恢复并不总是可能的,但现在有可能不进入错误状态和流畅的处理情况。如果在登录时出现异常,开发人员可以通过添加一些简单的检测来修复异常,在数组被访问或者改变它被访问之前。

如何处理未处理的异常

有些异常是你不希望出现的,比如代码中的错误。你可以登录未被代码捕获的那些异常,许多语言都提供这种处理异常的方法。(例如.NET的application_error和javascripts全球的on_errorhandler)。任何未被处理的异常都会显示为错误,而错误是无法依靠代码自行修复的。所以,记录下这些错误,能便于你能找出其中的原因。这样一来,错误就不会被当做异常被忽略了。一旦这些异常出现,你就可以很快的解决掉它们。

错误日志

错误日志可以帮助我们捕获错误。有了错误日志,你可以查看这些记录的错误和异常,这也是调试的关键,同时你还可以优先考虑什么时间修复哪些错误。你不必太依赖用户发来的截图和描述,更何况不是所有用户都会有兴趣来报错。错误日志可以让你的团队保持积极的行动力,一旦错误被发现,他们能够及时联系到用户,使其免受侵害。用户也会乐意接到你们的提醒,这还可以提升你的客户关系。当然,在用户使用到之前解决这些问题才是最关键的。

举例来说,一个导致计费有误的代码错误比不能显示特定详细页面这样的错误严重得多,即使不能显示详细页面这样的错误更容易出现。当你的应用程序出现异常时,你想要想办法去修复它,但是仅有1%的用户会主动报错,还有好多你不知道的错误存在潜在的隐患。

一些解决方案

写些代码来保存异常和堆叠追踪,把它们存在文件里或者通过电子邮件发送,可以提示你这些错误的发生,这是一种可行的办法。举例来说,一个用户在运行中遇到许多异常,一百个用户可能遇到一些不太频繁出现的错误,哪一个比较重要呢?在不知道具体错误情况的条件下,影响更多用户的错误更为重要。

使用异常中的堆叠追踪可以帮助你找出错误所在的位置,并且你应该能够复制或读取代码以了解出错的原因。有时候这还不够,问题还需要进一步的追踪。如果发生这种情况,在登录之前向异常添加更多信息,包括上下文特定的详细信息(如帐户ID或特定对象状态),这些信息将允许你在本地复制错误。现在你应该能发现所有的错误和异常,并且记录未处理的了吧。

根据你应用程序的大小,错误提示的噪音也是个问题。你可以通过邮件过滤做些聪明的事情,比如帮助你把错误分组,这也只是部分的解决办法。几年前我这样做过,但很快意识到出现的问题太多,而这只是部分的解决办法。

问题在于,我依然不知道哪些错误对用户的影响最大。我专注于抛出最多的错误而不是用户体验中最麻烦的错误。正因如此,我从来没有真正摸清过哪些错误更为严重。我没有可视化的表示正在发生什么,但必须运行手动查询来计算出来,这是相当耗时的。

大型软件中的错误和异常非常常见,正确的处理错误将作为评判一个团队的依据,也是一个突破错误和异常,创造美好运行环境的过程。好的应用程序包含在可能时从异常中恢复的代码。处理和记录异常对您的软件的健康非常重要!

作者:刘妮娜译

来源:51CTO

时间: 2024-09-17 04:03:41

消灭bug秘籍 如何处理大型软件中的错误和异常的相关文章

解析Java中所有错误和异常的父类java.lang.Throwable_java

在java语言中,错误类的基类是java.lang.Error,异常类的基类是java.lang.Exception. 1)相同点:java.lang.Error和java.lang.Exception都是java.lang.Throwable的子类,因此java.lang.Error和java.lang.Exception自身及其子类都可以作为throw的使用对象,如:throw new MyError();和throw new MyException();其中,MyError类是java.l

throw-Java的API中对未检测异常的处理方式问题

问题描述 Java的API中对未检测异常的处理方式问题 在JDK的API中,有很多类似这样的语句if (pathname == null) { throw new NullPointerException(); },我是这样想的--程序员在编写程序时如何避免未检测异常呢,就是要先判断一下,API也是一样的,它也判断了,只是说它不知道如何很好的处理就干脆抛出来.好,现在程序员开始编写代码,如果程序员在自己的程序里面没有判断是否为空,最后这种空指针异常发生了,程序停止, 突然觉得API的这个判断好像

MAC中快速安装卸载大型软件的技巧

  MAC新手用户们一定都想知道MAC系统是不是也可以通过Setup.exe之类的文件进行软件安装.其实这个在MAC系统中是可以做到的,今天小编就给介绍一下这种方法吧,有兴趣的用户可以看看. 安装软件: 获得了光盘或DMG文件后我们挂接到系统上,进入镜像中很直观的就能找到安装程序用的执行文件,一般是不会找错的.(如下图) 之后会出现一些关于版权信息或安装配置的步骤,再下一步就开始安装了,在安装完成前的最后一步就是更新系统相关的配置信息,在Mac OS X上几乎所有大型软件的安装都会进行系统配置信

再谈Finalizer对象--大型App中内存与性能的隐性杀手

    在上一篇<提升Android下内存的使用意识和排查能力>的文章中,多次提到了Finalizer对象.也可以看到该对象的清理至少是需要两次GC才能完成,而在Android5.0,尤其是6.0以后的系统中,对于该对象的回收变得更加的慢.我们在开发的时候往往关注内存的分配.泄漏,却容易忽视Finalizer对象,其实在大型App中,该对象是引起内存和性能问题的一个不可忽视的元凶.在类似于双十一会场的界面中,在使用一段时间后,设备会变得越来越慢,内存使用量也不断攀升,甚至容易引发OOM,这个有

Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka

本文主要是为了记录在工作中遇到的常用软件的安装过程,方便以后遇到相同情形时可以快速的查阅.主要讲述了zookeeper, kafka的安装. 本文的操作系统采用的是CentOS,可以采用shell命令查阅:lsb_release -a. Zookeeper Zookeeper的安装与配置 可以在http://zookeeper.apache.org/这里下载需要的安装包.这里采用的是zookeeper-3.4.6.tar.gz安装包. 1 首先将安装包解压: [root@hidden util]

如何处理ERP软件与CRM的关系

如何处理ERP软件与CRM的关系 CRM与ERP在各自的发展上不断相互渗透,二者的重复部分越来越多,且呈现集成的趋势,将二者整合起来,将大幅度增加决策的信息量,使决策更加及时准确.通过比较研究,可以在以下三个方面实现CRM与ERP的集成. 1.客户信息管理 与ERP都需要利用客户基本信息开展业务.进行决策,因此二者必须首先围绕客户信息管理进行整合.CRM的客户管理了系统和数据分析管理子系统都将为ERP系统提供信息支持和管理职能.ERP则借助CRM先进而完整的的客户信息管理功能,不但能够节约生产链

大型软件回归测试方法研究

摘要:程序被修改后,要保证程序能正常运行并且修改不能给程序质量带来任何负面影响,回归测试是必要的.大型软件系统结构复杂,构成要素多,如何做到不遗漏功能点同时降低软件回归测试代价,本文结合业务规则模型.修改影响分析和成本风险管理等技术提出了一种自动化回归测试方法. 关键词:回归测试风险管理修改影响分析 1.引言 在软件测试过 程中,由于需要对软件进行修改,修改后的程序必须重新测试,以确保程序的修改是否达到了目的和是否引入了新的错误,这种测试就是回归测试.软件的变化可能 是源于发现了错误并做了修改,

win8.1系统在程序或软件中输入文字变成问号怎么解决?

    win8.1系统在程序或软件中输入文字变成问号怎么解决?: 1.点击控制面板,然后将除自己使用的中文输入之外的其他语言.输入法等先全部删除; 2.然后再试一下,如果可以输入中文了,可适当添加一下"英语(美国)"即可. windows7教程 windows8教程 windows10教程

VB5报表设计器在人事管理软件中的应用

使用过VB5的人都会发出这样的赞誉-VB5真牛!的确,Visual Basic 5.0 以其强大的功能和优异的开发环境深深吸引了众多编程迷.彻底中文化的VB5中文版更深得专业人员及编程爱好者的喜爱.笔者在为某单位设计人事履历管理系统时就选用了VB5中文版.可是在设计报表时遇到了难题, 用printer对象的enddoc方法来实现打印的话,输出数十张格式各异的报表显然是太繁琐了.可能Miscrosoft公司也意识到了这一点,最终我发现它在 VB5企业版的外接程序中为我们提供了一个外接报表设计工具.