最近,修复了项目当中的一些bug,觉着有些思路可以分享出来供大家借鉴。

场景一 开发环境中系统正常运行,测试环境中,部分机器未能正常运行。

解决过程:远程连接了测试环境中的机器,观察了系统的运行情况,确实比较反常。查看日志后,发现出现了“xxx文件未找到”的异常。确认文件存在后,最先想到的就是,xxx依赖文件不存在,导致xxx文件未能正确加载。使用分析工具分析xxx文件依赖项后,发现测试环境确实是缺少了某些文件。从开发环境手动拷贝xxx文件的依赖文件到测试环境后,系统运行正常。

划重点:同一份代码,A环境运行正常,B环境运行异常,最有可能的原因就是环境因素,比如网络原因,磁盘权限原因,运行库缺失等原因。具体的原因分析可以依赖软件系统的日志,如果日志比较详细合理的话,对于分析解决问题有着莫大的帮助。如果,由于一些原因,软件系统没有日志,也可以查看一下操作系统的应用程序日志。当然,操作系统的应用程序日志对一些软件系统崩溃会有记录,但一般的异常情况不会记录。

场景二 逻辑A执行完毕后执行逻辑B,逻辑B执行完后执行逻辑C。逻辑A、B、C均放在try{}catch(){}块中,逻辑C未能正常执行。

解决过程:走读代码发现,逻辑A当中使用了try{}catch(){}块,逻辑B当中也使用了try{}catch(){}块,理论上来说,逻辑C是可以正常运行的。

private void MainFunc()
{
try
{
LogicA();
LogicB();
LogicC();
}
catch(Exception ex)
{
//Do someting
}
} private void LogicA()
{
try
{
//Do someting
}
catch(Exception ex)
{
//Do someting
}
} private void LogicB()
{
try
{
//Do someting
}
catch(Exception ex)
{
//Do someting
throw ex;
}
}

再仔细查看后发现,逻辑B的catch(){}块中使用了throw 语句,当逻辑B中出现异常时,逻辑C自然就不会执行了。预期的结果是,逻辑C需要正常执行,采用的办法是将逻辑C放入finally{}块中,并记录是否有异常发生,如果有异常发生,进行提示或记录。

 private void MainFunc()
{
bool hasError;
try
{
LogicA();
LogicB();
//LogicC();
}
catch(Exception ex)
{
//Do someting
hasError = true;
}
finally
{
if(hasError)
{
//Do something
}
LogicC();
}
}

划重点:在进行异常处理时,除了使用try{}catch(){}块以外,必要的操作应该采用finally{}块操作,确保资源被释放,无论是文件句柄,网络连接还是窗口关闭等。如果发生了异常,应该给出合适的提示,让用户清晰的知道,操作未能成功完成。

以上是修复bug过程中的一点儿小经验、小技巧,望大家笑纳。

献身说法---修复bug时的一些小技巧的更多相关文章

  1. gdb调试运行时的程序小技巧

    使用gdb调试运行时的程序小技巧 标签: 未分类 gdb pstack | 发表时间:2012-10-15 04:32 | 作者:士豪 分享到: 出处:http://rdc.taobao.com/bl ...

  2. linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!

    这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /et ...

  3. Android 在测试阶段当出现多个测试服务器地址时打包的小技巧

    前提:服务端没有做特殊处理 在开发android网络客户端项目时,不可避免的会用到“测试服务器地址”和“云端服务器地址”等.(有时可能会有多个) 这时在打包给测试那帮哥们时,你就需要一个服务器地址打上 ...

  4. 两个宝藏|关于我在github上冲浪时的一个小技巧。

    你好呀,我是歪歪. 前几天在 github 上冲浪的时候,发现了两个宝藏东西. 我也不藏着掖着了,拿出来给大家分享一下. 这两个宝藏是关于 arthas 和 SOFARegistry 的,这两个东西都 ...

  5. 对于shell脚本参数获取时的一点小技巧

    问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$ ...

  6. 程序员不修复BUG怎么办

    在测试过程中,难免遇到开发人员因为一些原因不想修改个别bug的情况.遇到这种问题时,该如何去推进开发修改bug呢? 一.现状分析 1.开发人员为啥不愿意修复BUG? (1)开发与测试对bug的定义理解 ...

  7. 12个非常实用的JavaScript小技巧

    在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...

  8. javascript的几个小技巧

    1.在循环中缓存array.length 这个技巧很简单,这个在处理一个很大的数组循环时,对性能影响将是非常大的.基本上,大家都会写一个这样的同步迭代的数组. for(var i=0;i<arr ...

  9. Python补充02 Python小技巧

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在这里列举一些我使用Python时积累的小技巧.这些技巧是我在使用Python过程 ...

随机推荐

  1. js实现每次程序发送一个数据 ,多次发送不一样,5秒后继续执行多次程序,判断如果五秒后发送过来的数据和上次不一样,少的删除多的增加

    /*存储设备ID*/var IDSNew = new Array();//判断是否已经启用服务var isopen = true;//需要放到接收设备数据处IDSNew[client.deviceId ...

  2. pyhton安装pillow问题解决

    最近在学习Python的微信处理相关,因wxpy库中的微信客户端需要接收二维码需要安装pillow,如下 class wxpy.Bot(cache_path=None, console_qr=Fals ...

  3. Java的类型转换

    Java的类型转换 在适当的时候,我们会想要将一种数据类型自动转换成另一种,比如把int转化成float类型.Java有隐藏式的自动转换,可以自动转换成想要的类型,但是强制的自动转换的话,.需要将希望 ...

  4. python 数据驱动(ddt)

    DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据),file_data(可以从json或者yaml中获取测试数据) 实例代码: import ddt import unittest ...

  5. 关系型数据库和NOSQL数据库对比

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt328 关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概 ...

  6. Springboot与Thymeleaf模板引擎整合基础教程(附源码)

    前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...

  7. 转:【深入Java虚拟机】之六:Java语法糖

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18011009 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家P ...

  8. 第四次作业 四则运算器在C++层面上的进一步思考

    OOA(Object Oriented Analysis,面向对象分析) 从客观存在的事务和事务之间的关系,归纳出有关对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个 ...

  9. 【2017集美大学1412软工实践_助教博客】团队作业7——Alpha冲刺之事后诸葛亮

    题目 团队作业7: http://www.cnblogs.com/happyzm/p/6827853.html 团队成绩 评分项目 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 全组 ...

  10. 201521123082 《Java程序设计》第5周学习总结

    201521123082 <Java程序设计>第5周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规 ...